1、线程状态
2、线程的终止
不推荐使用JDK提供的stop方法、destory方法,他们已经被废弃,这里使用标志位来终止线程
public class TestStop implements Runnable {
private boolean flag=true;
@Override
public void run() {
int i=0;
while(flag){
System.out.println("Thread"+i++);
}
}
public void stop(){
this.flag=false;
System.out.println("线程停止了!!");
}
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);//主线程循环到800的时候,让创建的线程停止
if(i==900){
testStop.stop();
}
}
}
}
线程被终止之后,只有主线程在运行
3、线程的休眠
需要指定当前线程阻塞的毫秒数,时间到达之后就进入就绪状态,可以模拟网络延时、倒计时等。每一个对象都有一把锁,sleep不会释放锁
(1)模拟网络延时:
public class TestSleep implements Runnable{
private int ticketsNums=10;
@Override
public void run() {
while(true){
if(ticketsNums<=0){
break;
}
try {
Thread.sleep(200);//延时200ms
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()+"拿到了"+ticketsNums--+"张票");
}
}
public static void main(String[] args) {
TestSleep testThread=new TestSleep();
new Thread(testThread,"zhai").start();
new Thread(testThread,"zhang").start();
new Thread(testThread,"liu").start();
}
}
如果不添加延时的代码,就会被第1个线程全部取走,当然,这个程序也体现了,在多个线程操作同一个数据的时候,存在线程安全的问题。
(2)模拟倒计时
public class TestSleep implements Runnable{
@Override
public void run() {
int num=10;
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num--);
if(num<=0){
break;
}
}
}
public static void main(String[] args) {
TestSleep testSleep=new TestSleep();
testSleep.run();
}
}
主线程每隔一秒钟调用一次run方法,参数为一千毫秒,也就是一秒钟
(3)读取系统时间
public class TestSleep implements Runnable{
@Override
public void run() {
Date startTime=null;
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
startTime=new Date(System.currentTimeMillis());
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
}
}
public static void main(String[] args) {
TestSleep testSleep=new TestSleep();
testSleep.run();
}
}
主线程每隔一秒钟读取一次系统时间,是通过调用run方法实现的
4、线程礼让
让当前正在执行的线程暂停,但不阻塞,将线程从运行状态,变为就绪状态,让CPU重新调度,礼让不一定成功
public class TestYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
public static void main(String[] args) {
TestYield testYield=new TestYield();
new Thread(testYield,"a").start();
new Thread(testYield,"b").start();
}
}
a线程开始执行
b线程开始执行
a线程停止执行
b线程停止执行
5、合并线程
待其它线程执行完成后,再执行调用JOIN方法的线程,此线程阻塞
public class JoinTest implements Runnable {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println("线程VIP来了");
}
}
public static void main(String[] args) {
JoinTest joinTest=new JoinTest();
Thread thread=new Thread(joinTest);
thread.start();
for(int i=0;i<1000;i++){
if(i==200){
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main-----"+i);
}
}
}
测试:
main-----194
main-----195
main-----196
main-----197
main-----198
main-----199
线程VIP来了
线程VIP来了
线程VIP来了
线程VIP来了
线程VIP来了
线程VIP来了
当组线程执行到200的时候,主线程被阻塞,开始执行定义的VIP线程,直到VIP线程执行完毕,再开始执行主线程
6、线程的状态
public class StateTest implements Runnable {
@Override
public void run() {
}
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 1; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("---------------");
});
Thread.State state = thread.getState();
System.out.println(state);
thread.start();
state = thread.getState();
System.out.println(state);
while (state!=Thread.State.TERMINATED){//只要线程不终止,就一直输出线程的状态
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
state=thread.getState();
System.out.println(state);
}
}
}
测试:
NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
---------------
TERMINATED