目录
- // 创建线程对象
- Thread t = new Thread() {
- public void run() {
- // 要执行的任务
- }
- };
- // 启动线程
- t.start();
- Runnable runnable = new Runnable() {
- public void run(){
- // 要执行的任务
- }
- };
- // 创建线程对象
- Thread t = new Thread( runnable );
- // 启动线程
- t.start();
- // 创建任务对象
- Runnable task2 = () -> log.debug("hello");
- // 参数1 是任务对象; 参数2 是线程名字,推荐
- Thread t2 = new Thread(task2, "t2");
- t2.start();
用 Runnable 更容易与线程池等高级 API 配合
用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
- // 创建任务对象
- FutureTask
task3 = new FutureTask<>(() -> { - log.debug("hello");
- return 100;
- });
- // 参数1 是任务对象; 参数2 是线程名字,推荐
- new Thread(task3, "t3").start();
- // 主线程阻塞,同步等待 task 执行完毕的结果
- Integer result = task3.get();
- log.debug("结果是:{}", result);
输出:
- 19:22:27 [t3] c.ThreadStarter - hello
- 19:22:27 [main] c.ThreadStarter - 结果是:100
| 方法名 | static | 功能说明 | 注意 |
| start() |
启动一个新线
程,在新的线程
运行
run
方法
中的代码
|
start
方法只是让线程进入就绪,里面代码不一定立刻
运行(
CPU
的时间片还没分给它)。每个线程对象的
start
方法只能调用一次,如果调用了多次会出现
IllegalThreadStateException
| |
| run() |
新线程启动后会
调用的方法
|
如果在构造
Thread
对象时传递了
Runnable
参数,则
线程启动后会调用
Runnable
中的
run
方法,否则默
认不执行任何操作。但可以创建
Thread
的子类对象,
来覆盖默认行为
| |
|
join()
|
等待线程运行结
束
| ||
|
join(long n)
|
等待线程运行结
束
,
最多等待
n
毫秒
| ||
|
getId()
|
获取线程长整型
的
id
|
id
唯一
| |
|
getName()
|
获取线程名
| ||
|
setName(String)
|
修改线程名
| ||
|
getPriority()
|
获取线程优先级
| ||
|
setPriority(int)
|
修改线程优先级
|
java
中规定线程优先级是
1~10
的整数,较大的优先级
能提高该线程被
CPU
调度的机率
| |
|
getState()
|
获取线程状态
|
Java
中线程状态是用
6
个
enum
表示,分别为:
NEW, RUNNABLE, BLOCKED, WAITING,
TIMED_WAITING, TERMINATED
| |
|
isInterrupted()
|
判断是否被打
断,
|
不会清除
打断标记
| |
|
isAlive()
|
线程是否存活
(还没有运行完
毕)
| ||
|
interrupt()
|
打断线程
|
如果被打断线程正在
sleep
,
wait
,
join
会导致被打断
的线程抛出
InterruptedException
,并清除
打断标
记
;如果打断的正在运行的线程,则会设置
打断标
记
;
park
的线程被打断,也会设置
打断标记
| |
|
interrupted()
|
static
|
判断当前线程是
否被打断
|
会清除
打断标记
|
|
currentThread()
|
static
|
获取当前正在执
行的线程
| |
|
sleep(long n)
|
static
|
让当前执行的线
程休眠
n
毫秒,
休眠时让出
cpu
的时间片给其它
线程
| |
|
yield()
|
static
|
提示线程调度器
让出当前线程对
CPU
的使用
|
主要是为了测试和调试
|
- public static void main(String[] args) {
- Thread t1 = new Thread("t1") {
- @Override
- public void run() {
- log.debug(Thread.currentThread().getName());
- FileReader.read(Constants.MP4_FULL_PATH);
- }
- };
- t1.run();
- log.debug("do other things ...");
- }
输出:
- 19:39:14 [main] c.TestStart - main
- 19:39:14 [main] c.FileReader - read [1.mp4] start ...
- 19:39:18 [main] c.FileReader - read [1.mp4] end ... cost: 4227 ms
- 19:39:18 [main] c.TestStart - do other things ...
t1 . start ();
- 19:41:30 [main] c.TestStart - do other things ...
- 19:41:30 [t1] c.TestStart - t1
- 19:41:30 [t1] c.FileReader - read [1.mp4] start ...
- 19:41:35 [t1] c.FileReader - read [1.mp4] end ... cost: 4542 ms
执行如下代码
- static int r = 0;
- public static void main(String[] args) throws InterruptedException {
- test1();
- }
- private static void test1() throws InterruptedException {
- log.debug("开始");
- Thread t1 = new Thread(() -> {
- log.debug("开始");
- sleep(1);
- log.debug("结束");
- r = 10;
- });
- t1.start();
- log.debug("结果为:{}", r);
- log.debug("结束");
- }
- private static void test1() throws InterruptedException {
- Thread t1 = new Thread(()->{
- sleep(1);
- }, "t1");
- t1.start();
- sleep(0.5);
- t1.interrupt();
- log.debug(" 打断状态: {}", t1.isInterrupted());
- }
输出:
- java.lang.InterruptedException: sleep interrupted
- at java.lang.Thread.sleep(Native Method)
- at java.lang.Thread.sleep(Thread.java:340)
- at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
- at cn.itcast.n2.util.Sleeper.sleep(Sleeper.java:8)
- at cn.itcast.n4.TestInterrupt.lambda$test1$3(TestInterrupt.java:59)
- at java.lang.Thread.run(Thread.java:745)
- 21:18:10.374 [main] c.TestInterrupt - 打断状态: false
- private static void test2() throws InterruptedException {
- Thread t2 = new Thread(()->{
- while(true) {
- Thread current = Thread.currentThread();
- boolean interrupted = current.isInterrupted();
- if(interrupted) {
- log.debug(" 打断状态: {}", interrupted);
- break;
- }
- }
- }, "t2");
- t2.start();
- sleep(0.5);
- t2.interrupt();
- }
输出:
20:57:37.964 [t2] c.TestInterrupt - 打断状态: true
- private static void test3() throws InterruptedException {
- Thread t1 = new Thread(() -> {
- log.debug("park...");
- LockSupport.park();
- log.debug("unpark...");
- log.debug("打断状态:{}", Thread.currentThread().isInterrupted());
- }, "t1");
- t1.start();
- sleep(0.5);
- t1.interrupt();
- }
输出:
- 21:11:52.795 [t1] c.TestInterrupt - park...
- 21:11:53.295 [t1] c.TestInterrupt - unpark...
- 21:11:53.295 [t1] c.TestInterrupt - 打断状态:true
- private static void test4() {
- Thread t1 = new Thread(() -> {
- for (int i = 0; i < 5; i++) {
- log.debug("park...");
- LockSupport.park();
- log.debug("打断状态:{}", Thread.currentThread().isInterrupted());
- }
- });
- t1.start();
- sleep(1);
- t1.interrupt();
- }
输出:
- 21:13:48.783 [Thread-0] c.TestInterrupt - park...
- 21:13:49.809 [Thread-0] c.TestInterrupt - 打断状态:true
- 21:13:49.812 [Thread-0] c.TestInterrupt - park...
- 21:13:49.813 [Thread-0] c.TestInterrupt - 打断状态:true
- 21:13:49.813 [Thread-0] c.TestInterrupt - park...
- 21:13:49.813 [Thread-0] c.TestInterrupt - 打断状态:true
- 21:13:49.813 [Thread-0] c.TestInterrupt - park...
- 21:13:49.813 [Thread-0] c.TestInterrupt - 打断状态:true
- 21:13:49.813 [Thread-0] c.TestInterrupt - park...
- 21:13:49.813 [Thread-0] c.TestInterrupt - 打断状态:true
| 方法名 | static | 功能说明 |
|
stop()
|
停止线程运行
| |
|
suspend()
|
挂起(暂停)线程运行
| |
|
resume()
|
恢复线程运行
|