线程的状态:
新生状态 : new的时候,线程处于新生状态
就绪状态 : start()方法后线程进入到就绪状态,等待cpu的调度,进入到就绪队列
运行状态 : cpu把时间片资源分配给某一个线程,线程才可以进入到运行状态
阻塞状态 : sleep()非能够正常运行完毕,直到阻塞解除
终止状态 : 线程结束
如果一个线程一旦进入到阻塞状态,无法直接恢复到运行状态,需要等待cpu调度
如果一个线程一旦进入到终止状态,无法恢复
一个线程如何进入终止状态: 1.正常运行完毕 2.通过标识判断 3.(stop(),destroy() 已过时)
一个线程如何进入就绪状态:
1.start()
2.yield() 礼让线程
3.阻塞解除
4.线程切换,被切换的线程直接进入就绪状态
一个线程如何进入阻塞状态:
1.sleep()
2.wait() 线程等待
3.join() 插队线程
线程阻塞状态:
sleep(): 抱着资源睡觉
对象锁不会释放,但是会让出cpu的资源
放大问题的可能性
模拟网络延迟
public class ThreadDemo02 implements Runnable{
public static void main(String[] args) {
new Thread(new ThreadDemo02()).start();
}
@Override
public void run() {
for(int i=10;i>=0;i--){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
.join() 插队线程 :
/*
* join() 插队线程
*/
public class JoinDemo04 {
public static void main(String[] args) {
new Thread(new Father()).start();
}
}
class Father implements Runnable{
@Override
public void run() {
System.out.println("想抽烟了....");
System.out.println("让儿子去买烟....");
Thread th=new Thread(new Son());
th.start();
/*try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println("接过烟,抽一口!!!!!");
}
}
class Son implements Runnable{
@Override
public void run() {
System.out.println("接过钱,去买烟...");
System.out.println("路过一个游戏厅,进去玩10s钟...");
for(int i=1;i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i+"s钟过去了");
}
System.out.println("赶紧去买烟...");
System.out.println("把烟给老爸,把钱揣兜里了...");
}
}
yield() 礼让线程:
public class YieldDemo03 implements Runnable{
public static void main(String[] args) {
new Thread(new YieldDemo03(),"A").start();
new Thread(new YieldDemo03(),"B").start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始了");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程结束了");
}
}
现成的优先级:
Thread.State getState()
返回该线程的状态。
优先级: 1~10 1最小 10最大,默认5
提高优先执行可能性,但是不是一定的
void setPriority(int newPriority) 更改线程的优先级
int getPriority() 返回线程的优先级。
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
public class StateDemo05 implements Runnable{
public static void main(String[] args) {
Thread th=new Thread(()->{
for(int i=0;i<=10;i++){
if(i==5){
try {
Thread.sleep(3000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
System.out.println(th.getState()); //NEW
th.start();
System.out.println(th.getState()); //RUNNABLE
while(true){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(th.getState());
if(th.getState()==Thread.State.TERMINATED){
System.out.println("th线程的状态为"+th.getState());
break;
}
}
Thread th1=new Thread(new StateDemo05(),"A");
Thread th2=new Thread(new StateDemo05(),"B");
Thread th3=new Thread(new StateDemo05(),"C");
th1.setPriority(Thread.MIN_PRIORITY);
th2.setPriority(Thread.MAX_PRIORITY);
th3.setPriority(7);
th1.start();
th2.start();
th3.start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+Thread.currentThread().getPriority());
}
}