第三章 创建和运行线程

152 阅读1分钟

方法一 使用Thread

public static void main(String[] args) {
    Thread t1 = new Thread("t1") {
        //方法内部实现了要执行的任务
        @Override
        public void run() {
            log.info("hello world");
        }
    };
    t1.start();
}

执行结果:

[t1] INFO Test01 - hello world

方法二 使用Runnable配合Thread

把【线程】和【任务】(要执行的代码)分开

  • Thread 代表线程
  • Runnable可运行的任务(线程要执行的代码)
public static void main(String[] args) {
    //创建任务对象
    Runnable task1 = new Runnable() {
        public void run() {
            log.info("hello world");
        }
    };

    //参数1是任务对象;参数2是线程名字
    Thread t1 = new Thread(task1, "t1");
    t1.start();
}

执行结果: [t1] INFO Test02 - hello world

小结

  • 方法1是把线程和任务合并在了一起,方法2是把线程和任务分开了
  • 用Rnnable更容易与线程等高级API配合
  • 用Rnnable让任务类脱离了Thread继承体系,更灵活

方法三 FutrureTask配合Thread

FutureTask能够接收Callable类型参数,用来处理有返回的结果的情况

public static void main(String[] args) throws ExecutionException, InterruptedException {
    //创建任务对象
    FutureTask<Integer> task1 = new FutureTask<>(() -> {
        log.debug("hello world");
        return 100;
    });

    //参数1是任务对象;参数2是线程的名字
    new Thread(task1,"t1").start();

    //主线程阻塞,同步等待task执行完毕的结果
    Integer result = task1.get();
    log.debug("结果是:{}",result);
}

执行结果:

  • [t1] INFO Test03 - hello world
  • [main] INFO Test03 - 结果是:100