1. 线程的创建和启动

1.1 继承Thread

  在run方法里,通过this获取当前线程。

  多个线程不能共享实例变量。

1.2 通过实现接口

1.2.1 实现Runable接口

  在run方法里,只能通过Thread.currentThread()获取当前线程。

  多个线程可以共享实例变量。

1.2.2 使用Callable和Future

call()方法比run()方法更强大:

  1. call()方法可以有返回值。

  2. call()方法可以声明抛出异常。

注意:

  1. Callable对象不能直接作为Thread的target
  2. FutureTask类实现了Future接口和Runable接口,可以作为Thread的target

2. 线程的生命周期

  1. new  new一个thread
  2. ready  调用start()
  3. run
  4. blocked
  5. terminated
    1. run()或call()方法正常结束
    2. 线程抛出Exception或Error
    3. 直接调用线程的stop()——容易导致死锁

当主线程结束时,其他线程不会受到影响,并不会随之结束。一旦子线程启动起来后,它就有和主线程相同的地位,它不会受主线程的影响。

3. 线程控制

3.1 join线程

调用者被阻塞,知道被调用线程执行完,调用者才会继续执行。

public class JoinThread extends Thread{

    public JoinThread(String name){
super(name);
} public void run(){
for(int i=0;i<100;i++){
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws Exception {
new JoinThread("新线程").start();
for(int i=0;i<100;i++){
if(i == 20){
JoinThread jt = new JoinThread("被join的线程");
jt.start();
//main线程调用了jt线程的join()方法,main线程必须等待
//jt执行结束之后才会向下执行
jt.join();
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

3.2 后台线程

如果所有前台线程死亡,后台线程自动死亡。

前台线程创建的子线程,默认是前台线程。后台线程创建的子线程,默认是后台线程。

 JoinThread jt = new JoinThread("被join的线程");
jt.setDaemon(true);
jt.start();

3.3 线程睡眠

Thread.sleep(3000);

3.4 线程让步

Thread.yield();

3.5 改变线程优先级

Thread.setPriority();

4. 线程同步

4.1 同步块synchronized statements

4.2 同步方法synchronized methods

  单线程:StringBuilder

  多线程:StringBuffer

同步方法,只对同一实例有效果,同一个类的不同实例的同一方法,是没有作用的。

4.3 同步监视器的释放

  1. 释放
    1. 当前线程的同步代码块和同步方法执行结束
    2. 当前线程,遇到了break、return终止了同步代码块和同步方法的执行
    3. 当前线程执行时,遇到了Error或Exception,异常结束时
    4. 当前线程执行同步代码块或同步方法时,程序调用了同步监视器的wait()方法
  2. 不释放
    1. 程序调用Thread.sleep()、Thread.yield()
    2. 其他线程调用当前线程的suspend()方法将当前线程挂起

4.4 同步锁

根接口:Lock、ReadWriteLock

实现类:ReentrantLock、ReentrantReadWriteLock、StampedLock

4.5 死锁

java虚拟机不检测死锁,也没有措施

5. 线程通信

5.1 传统

  1. wait()
  2. notify()
  3. notifyAll()

5.2 Lock and Condition

private final Lock lock = new ReentrantLock();
private final Condition cond = lock.newCondition();
...
cond.await();
cond.signal();
cond.signalAll();

5.3 BlockingQueue

6. 线程组

ThreadGroup

7. 线程池

  1. Executors
  2. ForkJoinPool

8. 线程相关类

8.1 ThreadLocal类

复制资源,不同的线程拥有不同的副本。

8.2 包装线程不安全的集合

HashMap m = Collections.synchronizedMap(new HashMap());

8.3 线程安全的集合

在java.util.concurrent包下

  1. Concurrent开头
    1. ConcurrentHashMap
    2. ConcurrentSkipListMap
    3. ConcurrentSkipListSet
    4. ConcurrentLinkedQueue
    5. ConcurrentLinkedDeque
  2. CopyOnWtrite开头
    1. CopyOnWriteArrayList
    2. CopyOnWriteArrayset

Java-Thread的更多相关文章

  1. Java Thread 的 sleep() 和 wait() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别       1. sleep ...

  2. Java Thread 的 run() 与 start() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别             1. ...

  3. Java Thread wait, notify and notifyAll Example

    Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...

  4. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

  5. Java Thread join() 的用法

    Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...

  6. Java thread jargon

    In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...

  7. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  8. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  9. [译]Java Thread wait, notify和notifyAll示例

    Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...

  10. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

随机推荐

  1. 尽量多的以 const/enum/inline 替代 #define

    前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ...

  2. (实用篇)PHP ftp上传文件操作类

    <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状态(成功/失败) publi ...

  3. win7将 esc与 capslock 互换

    一天手软,于是买了一个机械键盘.cherry g80-3494 红轴各方面都不错就是有一个问题我经常用vim,其中esc.及F键区离主键盘区实在是太远了. 习惯于vim模式的人都有一种懒症,就是手指非 ...

  4. box2dweb 学习笔记--sample讲解

    前言: 之前博文"台球游戏的核心算法和AI(1)" 中, 提到过想用HTML5+Box2d来编写实现一个台球游戏. 以此来对比感慨一下游戏物理引擎的巨大威力. 做为H5+box2d ...

  5. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  6. coreseek(sphinx)安装1(xml数据源配置和测试)

    1.下载coreseek-3.2.14-32版本.网址:http://www.coreseek.cn/products-install/install_on_windows/   (有详细的安装说明) ...

  7. clientX,screenX,pageX,offsetX的异同 【转载】

    首先说明一下以上对象都是指javascript中的,不包含其他语言. pageX/pageY: 鼠标相对于整个页面的X/Y坐标.注意,整个页面的意思就是你整个网页的全部,比如说网页很宽很长,宽2000 ...

  8. POJ-1947 Rebuilding Roads (树形DP+分组背包)

    题目大意:将一棵n个节点的有根树,删掉一些边变成恰有m个节点的新树.求最少需要去掉几条边. 题目分析:定义状态dp(root,k)表示在以root为根节点的子树中,删掉一些边变成恰有k个节点的新树需要 ...

  9. 黑马程序员——JAVA基础之final this.和super.的区别

    ------- android培训.java培训.期待与您交流! ----------  final关键字: final可以修饰类,方法,变量. final修饰的类不可以被继承. final修饰的方法 ...

  10. 黑马程序员——JAVA基础之数组

    ------- android培训.java培训.期待与您交流! ---------- 数组: 数组的定义: 数组是相同类型数据的集合, 描述的是相同类型的若干个数据按照一定的先后顺序排列组合而成,其 ...