- 停止线程:建议使用一个标志位进行终止变量
当flag=false;终止线程运行
//测试stop
//1.建议线程正常停止-->利用次数,不建议死循环
//2.建议标志位--->设置一个标志位
//3.不要使用stop或者destory等过时或者jdk不建议使用的方法
public class TestStop implements Runnable {
//1.线程中定义线程体使用的标识
private boolean flag=true;
@Override
public void run() {
// TODO Auto-generated method stub
int i=0;
while(flag) {
System.out.println("run....Thread"+i++);
}
}
//3.对外提供方法改变标识
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
TestStop ts=new TestStop();
new Thread(ts).start();
for(int i=0;i<100;i++) {
System.out.println("main"+i);
if(i==90) {
ts.stop();//调用stop方法切换标识位,让进程停止
System.out.println("线程停止了");
}
}
}
}
2.线程休眠
sleep(时间)指定当前线程阻塞的毫秒数
sleep存在异常:InteruptedException
sleep时间达到后线程进入就绪状态
sleep可以模拟网络延时,倒计时等:
每一个对象都有一个锁,sleep不会释放锁
//模拟倒计时
public class TestSleep2 {
public static void main(String[] args) {
timeDown();
//打印当前系统时间
Date startTime=new Date(System.currentTimeMillis());;//获取系统当前时间
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(new SimpleDateFormat("HH-mm-ss").format(startTime));
startTime=new Date(System.currentTimeMillis());//更新当前时间
}
}
//模拟倒计时
public static void timeDown() {
int num=10;
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(num--);
if(num<=0) {
break;
}
}
}
}
//模拟网络延时:放大问题的发生性
public class TestSleep implements Runnable {
//火车票票数
private static int ticket=10;
public void run() {
// TODO Auto-generated method stub
while(true) {
if(ticket<=0) {
break;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"购买了第"+ticket--+"票");
}
}
public static void main(String[] args) {
TestSleep th4=new TestSleep();
new Thread(th4,"小明").start();
new Thread(th4,"小样").start();
new Thread(th4,"小郭").start();
}
}
3.线程礼让
让当前正在执行的线程暂停,但不阻塞
将线程从运行态转为就绪态
让cpu重新调度,礼让不一定成功,看cpu心情
//测试礼让线程,礼让不一定成功,看cpu心情
public class TestYield {
public static void main(String[] args) {
MyYield my=new MyYield();
new Thread(my,"a").start();
new Thread(my,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();//线程礼让
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}
4.合并线程
Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞(可以想象为插队)
//测试join方法,想象位插队
public class TestJoin implements Runnable {
public void run() {
for(int i=0;i<100;i++) {
System.out.println("线程VIP来了");
}
}
public static void main(String[] args) {
//启动线程
TestJoin tj=new TestJoin();
Thread th=new Thread(tj);
th.start();
//主线程
for(int i=0;i<200;i++) {
if(i==150) {
try {
th.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//插队,强制执行
}
System.out.println("main"+i);
}
}
}
5.New