第二章 Java并行程序基础

2018-03-06  本文已影响0人  icelovesummer

1. 进程和线程

  1. NEW : 刚刚创建的线程,还没开始执行,等到start()方法调用,获得相关资源后进入RUNNABLE状态。
  2. RUNNABLE:线程执行状态。
  3. BLOCKED:线程执行时遇到sychronized同步块,进入BLOCKED状态。线程暂停执行,直到获取请求的锁,进入RUNNABLE。
  4. WAITING和TIMED_WAITING:等待状态,等待一些事件。如:wait()方法等待的线程在等待notify()方法,join()方法等待的线程在等待目标线程停止。等到期望事件后进入RUNNABLE状态。
  5. TERMINATED:线程执行完毕。

2. 初始线程:线程的基本操作

2.1 新建线程

  1. 继承Thread类,重写run方法(Java单继承,不建议使用)
  2. 实现Runnable接口,实现run方法,将实现类对象传入Thread构造函数。
class Thread1 implements Runnable{
    @Override
    public void run() {
        System.out.println("i am a thread");
    }
}

Thread thread2 = new Thread(new Thread1());
thread.start();

2.2 终止线程

2.3 中断线程

void interrupt():中断线程
boolean isInterrupted():判断是否被中断
static boolean interrupted():判断是否被中断,并且清除中断标志
Thread t1 = new Thread() {
    public void run() {
        while(true) {
            if(Thread.currentThread().isInterrupted()) {
                System.out.println("准备退出");
                break;
            }
            try {
                Thread.sleep(2000);
            }catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
             Thread.yield();
        }
    }
};
        
t1.start();
Thread.sleep(2000);
t1.interrupt();

2.4 等待(wait)和通知(notify)

等待队列 wait和notify工作流程

2.5 挂起(suspend)和继续执行(resume)

2.6 等待线程结束(join)和谦让(yield)

3. 分门别类的管理:线程组

ThreadGroup tg = new ThreadGroup("A组");
Thread t1 = new Thread(tg,new Thread(),"线程1");
Thread t2 = new Thread(tg,new Thread(),"线程2");
        
System.out.println(tg.activeCount());
tg.list();

4 守护线程(Daemon)

Thread t1 = new Thread();
t1.setDaemon(true);

5. 线程优先级

//Java中用1-10表示,值越大优先级越高
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

6. 线程安全与synchronized

  1. 指定加锁对象。
  2. 作用于实例方法:相当于对当前实例加锁。
  3. 作用于静态方法:相当于对当前类加锁。

7. 诡异的错误

//Integer是不可变的对象,一旦创建就不能修改,实际上每次i++都新建了Integer对象重新赋值,所以每次的锁不是同一个。
Integer i = 0;
sychronized(i){
  i++;
}

上一篇 下一篇

猜你喜欢

热点阅读