创建线程
new Thread
new Runnable
-
FutureTask
:用来处理有返回结果的情况FutureTask<Integer> task3 = new FutureTask<>(() -> { log.debug("hello"); return 100; }); new Thread(task3, "t3").start(); //主线程阻塞,同步等待 task 执行完毕的结果 Integer result = task3.get();
Thread
与Runnable
关系:
public class Thread implements Runnable{
//Thread属性之一
private Runnable target;
//当把Runnable作为参数传递给Thread,其实就是给Thread的target属性赋值
public Thread(Runnable target) {
this(null, target, "Thread-" + nextThreadNum(), 0);
}
//调用Thread的run方法实际还是调用Runnable的run方法,如果没有Runnable,就调用自己重写的方法
public void run() {
if (target != null) {
target.run();
}
}
}
public interface Runnable {
public abstract void run();
}
线程一些方法
方法名 | 功能说明 | 注意 |
---|---|---|
start() | 启动一个新线程,在新的线程运行 run 方法中的代码 | start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException |
join(long n) | 等待线程运行结束,有参数表示最多等待n毫秒,没有就是无限时长 | |
isInterrupted() | 判断是否被打断 | 不会清除打断标记 |
interrupt() | 打断线程 | 如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException,并清除打断标记;如果打断的正在运行的线程,则会设置打断标记;park的线程被打断,也会设置打断标记 |
interrupted() | 判断当前线程是否被打断 | 会清除 打断标记 |
currentThread() | 获取当前正在执行的线程 | |
sleep(long n) | 让当前执行的线程休眠n毫秒,休眠时让出 cpu 的时间片给其它线程 | |
yield() | 提示线程调度器让出当前线程对CPU的使用 | 主要是为了测试和调试 |
start( ) 与 run( )
- 直接调用 run 是在主线程中执行了 run,没有启动新的线程
- 使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码
sleep与yield
sleep
- 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
- 其它线程可以使用
interrupt
方法打断正在睡眠的线程,这时 sleep 方法会抛出InterruptedException
,并清除打断标记,如果还想要打断标记,则在catch
块里再调用interrupt
- 睡眠结束后的线程未必会立刻得到执行
yield
- 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
- 具体的实现依赖于操作系统的任务调度器,CPU有可能选择调用该线程
网友评论