线程五大状态
线程方法
停止线程
测试停止线程
注意三个点:
- 建议线程正常停止—>利用次数,不建议死循环
- 建议使用标志位—>设置一个标志位
- 不用使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable {
//1.设置一个标志位
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag){
System.out.println("run...Thread"+i++);
}
}
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main-----"+i);
if (i == 900){
testStop.stop();
System.out.println("线程该停止了。");
}
}
}
}
线程休眠
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSleep2 {
public static void main(String[] args) {
Date startTime = new Date(System.currentTimeMillis());
while (true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis());//更新当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程礼让(yield)
//测试礼让线程
//礼让不一定成功,看CPU心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield, "A").start();
new Thread(myYield, "B").start();
/*
A线程开始执行!
B线程开始执行!
A线程停止执行!
B线程停止执行!
*/
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行!");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程停止执行!");
}
}
Join()
public class TestJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程vip来了"+i);
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
for (int i = 0; i < 1000; i++) {
if (i == 200){
thread.join();//相当于插队,让它先执行完所在线程的任务
}
System.out.println("main"+i);
}
}
}
线程状态观测
//观察测试线程状态
public class TestState {
public static void main(String[] args) {
//新生创建
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("thread结束");
});
Thread.State state = thread.getState();
System.out.println(state);
//观察启动
thread.start();
state = thread.getState();
System.out.println(state);
while (state != Thread.State.TERMINATED){//只要线程不终止,就一直输出状态
try {
Thread.sleep(300);
state = thread.getState();
System.out.println(state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
thread结束
TERMINATED
*/
PS:线程死亡后就不能再执行。一个线程只能执行一次。
线程的优先级
public class TestPriority {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "--->" + Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority);
Thread t2 = new Thread(myPriority);
Thread t3 = new Thread(myPriority);
Thread t4 = new Thread(myPriority);
Thread t5 = new Thread(myPriority);
//先设置优先级,再启动
t1.start();
t2.setPriority(1);
t2.start();
t3.setPriority(Thread.MAX_PRIORITY);
t3.start();
t4.setPriority(4);
t4.start();
t5.setPriority(8);
t5.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"---->" + Thread.currentThread().getPriority());
}
}
/*
main--->5
Thread-2---->10
Thread-4---->8
Thread-0---->5
Thread-3---->4
Thread-1---->1
*/
PS:执行顺序不一定根据优先级进行,还是依靠CPU分配资源进行的。 优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度。
守护(daemon)线程
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
Person person = new Person();
Thread thread = new Thread(god);
thread.setDaemon(true);//默认是false表示是用户线程,正常的线程都是用户线程,为true表示为守护线程
thread.start();//守护线程启动
new Thread(person).start();//用户线程启动
}
}
class God implements Runnable{
@Override
public void run() {
while (true){
System.out.println("上帝保佑着你!");
}
}
}
class Person implements Runnable{
@Override
public void run() {
for (int i = 0; i < 36500; i++) {
System.out.println("今天也好好地活着。");
}
System.out.println("======goodbye!world!======");
}
}
(文章通过狂神说视频内容进行总结。)