本文最后更新于:April 15, 2022 am
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。
目录
基础方法
方法名 |
描述 |
setName |
设置线程名称。只能用于Thread。 |
getName |
返回线程名称 |
setPriority |
设置线程优先级(1-10) |
getPriority |
获取线程优先级 |
sleep |
睡眠 |
interrupt |
中断线程,但并没有结束线程。一般用于中断正在休眠的线程。 |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package com.threadStu;
import lombok.SneakyThrows;
public class TestThread01 { public static void main(String[] args) throws InterruptedException {
T t = new T(); Thread thread = new Thread(t); thread.setName("ttf"); thread.setPriority(3); thread.start();
for(int i=5;i>=1;--i){ System.out.println("唤醒线程倒计时 "+i); Thread.sleep(1000); }
System.out.println(thread.getPriority()); thread.interrupt();
} }
class T implements Runnable {
@Override public void run() { while(true){ for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+"线程执行了:"+" "+i); }
try { System.out.println(Thread.currentThread().getName()+" 休眠中.. "); Thread.sleep(20000); }catch (Exception e){ System.out.println(Thread.currentThread().getName()+" 被interrupt唤醒.."); } }
} }
|
礼让和插队
- yield:线程礼让。让出CPU,让其他线程执行,但礼让时间不确定,礼让是否成功不确定。
- join:线程插队。插队的线程一旦插队成功,则必须要完成插队的线程所有任务后才能继续向下执行。(和人排队插队一样,肯定要让插队的人弄完了之后才会下一位。)
礼让
有main、son两个线程。开始时同时执行,当main执行5次后,就进行礼让。但礼让不一定成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package com.threadStu;
import lombok.SneakyThrows;
public class TestThread01 { public static void main(String[] args) throws InterruptedException {
T t = new T(); Thread son = new Thread(t); son.setName("son"); son.start();
for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+" main 吃东西"+i); Thread.sleep(1000); if(i==5){ System.out.println("=================进行礼让 "); Thread.yield(); } } } }
class T implements Runnable {
@SneakyThrows @Override public void run() {
for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+" 吃东西 "+i); Thread.sleep(1000); }
} }
|
插队
有main、son两个线程。开始时同时执行,当main执行5次后,就让son线程进行插队。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package com.threadStu;
import lombok.SneakyThrows;
public class TestThread01 { public static void main(String[] args) throws InterruptedException {
T t = new T(); Thread son = new Thread(t); son.setName("son"); son.start();
for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+" main 吃东西"+i); Thread.sleep(1000); if(i==5){ System.out.println("=================让son进行插队 "); son.join(); } } } }
class T implements Runnable {
@SneakyThrows @Override public void run() {
for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+" 吃东西 "+i); Thread.sleep(1000); }
} }
|
用户线程和守护线程
- 用户线程:也叫工作线程,当线程的任务执行完或同通知的方式结束。
- 守护线程:一般为工作线程服务,当所有的用户线程结束,守护线程自动结束。
- 常见的守护线程:垃圾回收机制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.threadStu;
import lombok.SneakyThrows;
public class TestThread01 { public static void main(String[] args) throws InterruptedException {
T t = new T(); Thread boss = new Thread(t); boss.setName("boss");
boss.start();
for(int i=1;i<=20;++i){ System.out.println(Thread.currentThread().getName()+" 在摸鱼 "+i); Thread.sleep(500); } } }
class T implements Runnable {
@SneakyThrows @Override public void run() {
for(int i=1;i<=200;++i){ System.out.println(Thread.currentThread().getName()+" 在监督你 "+i); Thread.sleep(1000); }
} }
|
📢注意:设置守护线程必须在start()之前,否则会抛出异常 IllegalThreadStateException 。