博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程讲解(二)
阅读量:3958 次
发布时间:2019-05-24

本文共 2411 字,大约阅读时间需要 8 分钟。

线程的管理

当线程启动后,可以管理线程,使线程休眠、等待或中断执行等.

join() 方法:等待

在某些情况下,一个线程需要等另外一个线程执行结束后,才能执行.这种功能可以使用join()方法实现.

当调用了某个线程类的对象实例的join()方法,则会等待该对象执行结束.

sleep() 方法

线程的 sleep() 方法使一个线程暂停一段固定的时间,该方法能够把CPU让给优先级比其低的线程.

yield() 方法:让步

为了防止某个线程独占 CPU 资源,可以让当前执行的线程休息一下,yield()方法可以实现该功能.

yield()方法用于使当前线程让出CPU的使用权,但是这并不能保证CPU接下来调用的不是该线程.

interrupt() 方法:中断

一个线程除了正常执行结束外,也可以人为地中断线程的执行,线程的中断可以使用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 接口

接口 Callable 和 Runnable 类似,其定义的一般形式:

public interface Callable
{
  V call() throws Exception;}

其中,类型参数 V 指明了线程返回值的类型.Callable 将返回一个 Integer 型的值.

使用接口 Callable 创建的线程必须实现 call() 方法,call() 方法的返回值类型由 V 来指定.

Future 接口

Future 接口允许在未来某个时间获得线程运行的结果,它保存了使用 Callable 接口定义的线程异步运行的结果.当启动一个 Future 对象后,相当于启动了一个计算, Future 对象的计算结果在计算好后得到.

Future 接口的常用方法:

  • V get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  • V get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,则抛出 TimeOutException 异常.
  • boolean cancel(boolean mayInterrupt) 尝试取消任务的运行.
  • boolean isCancelled 判断是否被取消.
  • boolean isDone 判断任务是否已经完成.

FutureTask 包装器同时实现了接口 Runnable 和 Callable,它可以很方便地对 Callable 对象进行封装并转换成 Future 对象.

public FutureTask(Callable
callable) {
}public FutureTask(Runnable runnable, V result) {
}

Callable 和 Runnable 比较

  • Callable 是有返回值的,而 Runnable 没有返回值.
  • Callable 执行入口方法是call()方法,Runnable 的执行入口方法是run().
  • call() 方法可以抛出异常,run()方法不可以.
  • 运行 Callable 相当于启动了一个异步计算,将来在通过 Future 得到计算的结果;而且可以使用 Future 的 cancel()方法取消方法的执行.

转载地址:http://jyazi.baihongyu.com/

你可能感兴趣的文章
牛客第十七届上海大学程序设计春季联赛——E CSL 的魔法(贪心)
查看>>
杭电ACM——1028,Ignatius and the Princess III(母函数)
查看>>
杭电ACM——1171,Big Event in HDU(母函数)
查看>>
杭电ACM——6491,时间间隔(思维)
查看>>
杭电AC——1085,Holding Bin-Laden Captive!(母函数)
查看>>
杭电ACM——2110,Crisis of HDU(母函数)
查看>>
杭电AM——2152,Fruit(母函数)
查看>>
杭电ACM——2566,统计硬币(DP)
查看>>
堆栈(数据结构)
查看>>
队列(数据结构)
查看>>
杭电ACM——1251,统计难题(Trie树)
查看>>
牛客网哈尔滨工程大学第十四届程序设计竞赛(同步赛)—— 小蚂蚁过马路(思维)
查看>>
牛客网哈尔滨工程大学第十四届程序设计竞赛(同步赛)—— 苹果手链(水题)
查看>>
杭电ACM——6518,Clumsy Keke(暴力+思维)
查看>>
杭电ACM——6512,Triangle(暴力 / 思维)
查看>>
牛客网哈尔滨工程大学第十四届程序设计竞赛(同步赛)——D 简单的烦恼(DP)
查看>>
牛客网哈尔滨工程大学第十四届程序设计竞赛(同步赛)——I 杨主席发糖(思维)
查看>>
杭电ACM——1305,Immediate Decodability(Trie树)
查看>>
杭电ACM——1075,What Are You Talking About(Tire树)
查看>>
杭电ACM——1277,全文搜索(搜索)
查看>>