1.创建与运行线程
1.1 直接使用Thread
@Slf4j(topic = "c.ThreadTest1")
public class ThreadTest1 {
public static void main(String[] args) {
//创建Thread线程对象
Thread thread = new Thread(){
@Override
public void run() {//执行的任务
log.debug("running");
}
};
thread.setName("t1");
//启动线程
thread.start();
log.debug("running");
}
}
1.2 使用 Runnable 配合 Thread
把【线程】和【任务】(要执行的代码)分开
- Thread 代表线程
- Runnable 可运行的任务(线程要执行的代码)
@Slf4j(topic = "c.ThreadTest2")
public class ThreadTest2 {
public static void main(String[] args) {
Runnable r = () -> log.debug("running");
Thread t = new Thread(r,"t2");
t.start();;
log.debug("running");
}
//lambda简化
public static void test2(){
Thread t = new Thread(()->{log.debug("running");},"t2");
t.start();
}
}
-
原理之 Thread 与 Runnable 的关系
分析 Thread 的源码,理清它与 Runnable 的关系方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了 用 Runnable 更容易与线程池等高级 API 配合 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
1.3 FutureTask 配合 Thread
FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况
run方法有执行结果以及可以抛出异常
@Slf4j(topic = "c.ThreadTest3")
public class ThreadTest3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建任务对象
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("running");
return 100;
}
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t = new Thread(task,"t3");
t.start();
t.sleep(1000);
// 主线程阻塞,同步等待 task 执行完毕的结果
log.debug("{}",task.get());
}
}