第2章 Java并行程序基础
2.1 有关线程你必须知道的事
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程就是轻量级进程,是程序执行的最小单位。
2.2 初始线程:线程的基本操作
2.2.1 新建线程
(1)继承Thread类,重写run()方法
Thread t=new Thread(); t.start(); |
默认情况下,Thread的run()方法什么也没有做,因此,一个线程一启动就结束了。
如果想让线程做点什么,就必须重写run()方法,把你的“任务”填进去。
//此代码采用匿名内部类,重写run()方法 Thread t=newThread(){ @Override public void run(){ System.out.println(“I am 线程t”) } }; t.start(); |
(2)实现Runnable接口
Runnable接口是一个单方法接口,它只有一个run()方法:
public interface Runnable{ public abstract void run(); } |
2.2.2 终止线程
(1)stop()方法:stop()方法已被废弃,因为它太过暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题。
(2)设置标记变量:用于指示线程是否需要退出
2.2.3 线程中断
严格地讲,线程中断并不会使线程立即退出,而是给目标线程一个通知,告知目标线程有人希望你退出了。
与线程中断有关的3个方法:
1.public void Thread.interrrupt() //中断线程 |
2.public boolean Thread.isInterrrupted() //判断是否被中断 |
3.public static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态 |
方法签名:方法名+参数列表
Thread.sleep()方法签名:public static native void sleep(long millis) throws InterruptedException
InterruptedException是非运行时异常,程序必须捕获并处理它,当线程在sleep()休眠时,如果被中断,这个异常就会产生。
注意:Thread.sleep()方法由于中断而抛出异常,此时,他会清除中断标记,如果不加出理,那么下一次循环开始时,就无法捕获这个中断,故异常出理中,再次设置中断标记位。
2.2.4 等待(wait)和通知(notify)
wait()和notify()方法位于Object类中,任何对象都可调用这两个方法。
方法签名:
public final void wait() throws InterruptedException |
public final native void notify() |
当在一个对象实例上调用wait()方法时候,当前线程就会在这个对象上等待。等到何时结束?等到其它线程调用了notify()方法为止。
多个线程同时等待某一个对象,当object.notify()被调用时,他就会从这个等待队列中,随机选择一个线程,并将其唤醒。这是不公平的。
Object对象还有一个类似的notifyAll()方法,它和notify()的功能基本一致,不同的是,它会唤醒在这个等待队列中所有等待的线程。
注意:Object.notify()并不是可以随意调用,它必须包含在对应的synchronized语句中,无论是wait()和notify()都需要首先获得目标对象的一个监视器。
注意:Object.wait()和Thread.sleep()方法都可以让线程等待若干时间,除了wait()可被唤醒外,另外一个主要区别就是wait()ff会释放目标对象的锁,而Thread.sleep()方法不会释放任何资源。
2.2.5 挂起(suspend)和继续执行(resume)线程
一对相反的操作。它们已被标记为废弃方法,不推荐使用。
不推荐使用suspend()去挂起线程的原因:suspend()导致线程暂停的同时,它并不会释放任何锁资源。其它任何线程想要访问被它暂用的锁时,都会被牵连,导致无法正常继续执行。
2.2.6 等待线程结束(join)和谦