JAVA线程-线程的常用方法

本文最后更新于: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;

/**
* @Author DragonOne
* @Date 2022/4/15 08:17
* @墨水记忆 www.tothefor.com
*/
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); //睡眠20s
}catch (Exception e){
//当该线程执行到一个interrupt方法时,会catch一个异常
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;

/**
* @Author DragonOne
* @Date 2022/4/15 08:17
* @墨水记忆 www.tothefor.com
*/
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;

/**
* @Author DragonOne
* @Date 2022/4/15 08:17
* @墨水记忆 www.tothefor.com
*/
public class TestThread01 {
public static void main(String[] args) throws InterruptedException {

T t = new T();
Thread son = new Thread(t);
son.setName("son"); //son线程
son.start();

for(int i=1;i<=20;++i){
System.out.println(Thread.currentThread().getName()+" main 吃东西"+i);
Thread.sleep(1000);
if(i==5){ //当main线程执行5次后,就让son线程插队
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;

/**
* @Author DragonOne
* @Date 2022/4/15 08:17
* @墨水记忆 www.tothefor.com
*/
public class TestThread01 {
public static void main(String[] args) throws InterruptedException {

T t = new T();
Thread boss = new Thread(t);
boss.setName("boss");
// boss.setDaemon(true); //设置为守护线程
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 。