停止线程
不推荐使用jdk提供的废弃的stop(),destroy()方法
推荐线程自己停下来
建议使用一个标志位进行终止变量,当flag=false,则终止线程运行
package state;
//测试stop
//1.建议线程自己终止-->利用次数,不建议死循环
//建议使用标志位-->设置一个标志位
//不推荐使用jdk提供的废弃的stop(),destroy()方法
public class TestStop implements Runnable{
private boolean flag=true;
@Override
public void run() {
int i=0;
while(flag){
System.out.println("run....Thread"+i++);
}
}
//2设置一个公开的方法停止线程,转换标志位
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){
//调用stop方法切换标志位,让线程终止
testStop.stop();
System.out.println("线程该停止了");
}
}
}
}
线程休眠
sleep(时间)指定当前线程阻塞的毫秒数
sleep存在异常InterruptedException;
sleep时间达到后进程进入就绪状态
sleep可以模拟网络延迟,倒计时
每一个对象都有一个锁,sleep不会释放锁
package state;
//模拟
public class TestSleep implements Runnable{
public static void main(String[] args) {
TestSleep testThread4=new TestSleep();
new Thread(testThread4,"小明").start();
new Thread(testThread4,"老师").start();
new Thread(testThread4,"黄牛党").start();
}
//票数
private int ticketNums=10;
@Override
public void run() {
while (true){
if (ticketNums <= 0) {
break;
}
//模拟延时(弊端)
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了"+ticketNums--);
}
}
}
线程礼让
礼让线程,让当前正在执行的线程暂停,但不阻塞
让线程从运行状态转换为就绪状态
让cpu重新调度,礼让不一定成功,看cpu心情
package state;
//测试礼让线程不一定成功,看cpu
public class TestYield {
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()+"线程停止执行");
}
}