线程状态:
new–>
Thread t = new Thread();线程对象一旦创建就进入到了新生状态;
start–>
当调用start()方法,线程立即进入就绪状态,但不意味着立即进入调度执行;
run–>
run()进入运行状态,线程才真正执行线程体的代码块;
sleep–>
当调用sleep(),wait()或同步锁定时,线程进入阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态,等待cpu调度执行;
dead–>
线程中断或者结束,一旦进入死亡状态,就不能再次启动;
守护线程(daemon):
1.线程分为用户下线程和守护线程;
2.虚拟机必须确保用户线程执行完毕;
3.虚拟机不用等待守护线程执行完毕;
4.后台记录操作日志,监控内存,垃圾回收等待;
package org.example;
public class TestDaemon {
public static void main(String[] args) {
II you = new II();
God god = new God();
Thread thread = new Thread(god);
thread.setDaemon(true);//默认是false用户线程,true为守护线程
thread.start();
new Thread(you).start();
}
}
class II implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("你活着"+i);
}
System.out.println("goodbye");
}
}
class God implements Runnable{
@Override
public void run() {
while(true){
System.out.println("上帝守护者你");
}
}
}
join
package org.example;
//Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞,可以想象成插队
public class ThreadJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("VIP来了"+i);
}
}
public static void main(String[] args) {
ThreadJoin threadJoin = new ThreadJoin();
Thread thread = new Thread(threadJoin);
thread.start();
for (int i = 0; i < 300; i++) {
if(i==200){
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main方法"+i);
}
}
}
Yield
package org.example;
public class ThreadYield {
/*线程礼让,让当前正在执行的线程暂停,但不阻塞
* 将线程从运行状态转为就绪状态
* 让cpu重新调度,礼让不一定成功*/
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"结束");
}
}
sleep
package org.example;
public class ThreadSleep {
/*
* sleep指定当前线程阻塞的毫秒数
* 存在异常InterruptedException
* 时间到达后线程进入就绪状态
* 可以模拟网络延迟,倒计时
* 每一个对象都有一个锁,sleep不会释放锁*/
// 模拟倒计时
public static void main(String[] args) {
try {
TenDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void TenDown() throws InterruptedException {
int num = 10;
while(true){
System.out.println(num--);
Thread.sleep(1000);
if(num<0){
break;
}
}
}
}
终止线程
package org.example;
//使用外部方法使线程停止
public class ThreadState implements Runnable {
private boolean flag = true;
@Override
public void run() {
int i = 0;
while(flag){
System.out.println("------"+i++);
}
}
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
ThreadState threadState = new ThreadState();
new Thread(threadState).start();
for (int i = 0; i < 100; i++) {
System.out.println("+++++"+i);
if(i==90){
threadState.stop();
System.out.println("线程停止了");
}
}
}
}