本文共 2411 字,大约阅读时间需要 8 分钟。
当线程启动后,可以管理线程,使线程休眠、等待或中断执行等.
在某些情况下,一个线程需要等另外一个线程执行结束后,才能执行.这种功能可以使用join()
方法实现.
join()
方法,则会等待该对象执行结束. 线程的 sleep()
方法使一个线程暂停一段固定的时间,该方法能够把CPU让给优先级比其低的线程.
为了防止某个线程独占 CPU 资源,可以让当前执行的线程休息一下,yield()
方法可以实现该功能.
yield()
方法用于使当前线程让出CPU的使用权,但是这并不能保证CPU接下来调用的不是该线程. 一个线程除了正常执行结束外,也可以人为地中断线程的执行,线程的中断可以使用interrupt()
方法.
wait()
方法或``join()方法正处于阻塞队列中,则中断请求不会被响应,并会抛出 InterruptedExcepton 异常. 在程序中调用
interrupt()方法后,通过需要在线程的
run()方法中使用类 Thread 的方法
isInterrupted()`进行判断. 用于管理线程的方法,还有stop()
、suspend()
和resume()
等,这里就不说明了.
如果有若干个正在做同一个工作的线程,为了方便管理,可以对这些线程进行分组,从而把同一组的线程作为一个整体进行操作.
在线程 Thread 的构造方法中,可以指明线程属于哪一个分组:public Thread(ThreadGroup group,Runnable target)
其中,参数group 可以指明该线程属于哪一个线程组. 在并发编程过程中,有一个疑问:在程序中创建多少个线程最合适?创建多少个线程才能使程序性能运行最佳?
线程数目的多少对程序性能有一定的影响. 数目少了,处理器会处于闲置状态,浪费资源. 数目多了,多余的线程不能马上执行,浪费了软件资源. 在 JAVA 中提供了相关的方法,可用于获取处理器可以同时处理的最大线程数:int nthreads = Runtime.getRuntime().availableProcessors()
类 ThreadLocal 是一个非常有用的类. JAVA 通过类 ThreadLocal 实现线程本地对象,使用类 ThreadLocal 将会使变量在每个线程的私有区域内有一个副本,每个线程都可以相对独立的改变自己的副本,而不会影响到其他线程的副本.值得说明的是,ThreadLocal 并不是一个线程,而是表示线程的一个局部变量.
ThreadLocal 类提供了方法set()
和 get()
用于设置和读取线程的本地值.一个线程首次获取一个线程本地对象值的时候将调用 initialValue()
方法,该方法用于对每个线程对象进行初始化. 无论是从 Thread 类继承还是实现 Runnable 接口来创建线程,方法 run()
是没有返回值的.带返回值的线程可以通过 Callable 来定义,通过 Future 接口来获得线程的返回值.
接口 Callable 和 Runnable 类似,其定义的一般形式:
public interface Callable{ V call() throws Exception;}
其中,类型参数 V 指明了线程返回值的类型.Callable 将返回一个 Integer 型的值.
使用接口 Callable 创建的线程必须实现call()
方法,call()
方法的返回值类型由 V 来指定. Future 接口允许在未来某个时间获得线程运行的结果,它保存了使用 Callable 接口定义的线程异步运行的结果.当启动一个 Future 对象后,相当于启动了一个计算, Future 对象的计算结果在计算好后得到.
Future 接口的常用方法:
FutureTask 包装器同时实现了接口 Runnable 和 Callable,它可以很方便地对 Callable 对象进行封装并转换成 Future 对象.
public FutureTask(Callablecallable) { }public FutureTask(Runnable runnable, V result) { }
call()
方法,Runnable 的执行入口方法是run()
.call()
方法可以抛出异常,run()
方法不可以.cancel()
方法取消方法的执行.转载地址:http://jyazi.baihongyu.com/