Java线程基础

2020-05-18  本文已影响0人  林嘻嘻呀

创建线程

  1. new Thread
  2. new Runnable
  3. FutureTask:用来处理有返回结果的情况
    FutureTask<Integer> task3 = new FutureTask<>(() -> {
     log.debug("hello");
     return 100;
    });
    
    new Thread(task3, "t3").start();
    
    //主线程阻塞,同步等待 task 执行完毕的结果
    Integer result = task3.get();
    

ThreadRunnable关系:

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( )

sleep与yield
sleep

  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
  2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出InterruptedException,并清除打断标记,如果还想要打断标记,则在catch块里再调用interrupt
  3. 睡眠结束后的线程未必会立刻得到执行

yield

  1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
  2. 具体的实现依赖于操作系统的任务调度器,CPU有可能选择调用该线程
上一篇 下一篇

猜你喜欢

热点阅读