版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miracle_Gaaral/article/details/86773112
一.线程的状态
1.新生状态; 2.就绪状态; 3.运行状态; 4.阻塞状态; 5.死亡状态
二.停止线程
1.自然终止:线程体正常执行完毕
2.外部干涉:
1).线程类中,定义线程体使用的标识
2).线程体使用该标识
3).对外提供的方法改变该标识
4).外部根据条件调用该方法即可
三.阻塞
1.join: 合并线程
package com.kennosaur.state;
/**
* join:合并线程
* @author Administrator
*
*/
public class Join extends Thread{
public static void main(String[] args) throws InterruptedException {
Join demo = new Join();
Thread thread = new Thread(demo); //新生
thread.start(); //就绪
//cpu调度进入运行
for (int i = 0; i < 100; i++) {
if (50==i) {
thread.join(); //main阻塞
}
System.out.println("main..."+i);
}
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("join..."+i);
}
}
}
2.yield:暂停线程 static静态方法
3.sleep:休眠, 不释放锁
a.与实践相关: 倒计时
b.模拟网络延时
package com.kennosaur.state;
/**
* sleep模拟网络延时
* @author Administrator
*
*/
public class Sleep02 {
public static void main(String[] args) {
//真实角色
Web12306 web = new Web12306();
//代理
Thread t1 = new Thread(web, "路人甲");
Thread t2 = new Thread(web, "路人乙");
Thread t3 = new Thread(web, "攻城狮");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
class Web12306 implements Runnable{
private int num=50;
@Override
public void run() {
while (true) {
if (num<=0) {
break; //跳出循环
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到了"+num--);
}
}
}
输出结果:
......
路人乙抢到了1
攻城狮抢到了0
路人甲抢到了-1
后面两个线程执行,是由于并发带来的问题,造成资源分配冲突