JAVA learning diary: thread (4)

	今日内容的定义和例子我几乎是对照着课程一起同步记录的,所以内容大相径庭,这篇就先不标榜原创了。

The main content learned today:

1.线程状态解析
2.线程的状态
3.线程的中断
4.线程停止
5.守护线程

Thread status analysis:

新创建状态(new):使用new创建一个新的线程对象,但是尚未调用start()方法。
  		
可运行状态(Runnable):一旦线程调用了start()方法就为可运行,但是这只能说明该线程目前
是出于能够运行的状态并不已经是在运行的状态。

阻塞状态(blocked):处于运行状态的线程,由于某些原因的阻碍,使他处于一段时间的停滞状态
一般是等待一个锁,以访问某个对象。
	
计时等待状态(Timed waiting):指的是在一个限定期内等待另一个线程来执行某一个动作的状态。
		
终止状态(dead):是指线程的正式结束,run()方法执行完毕后返回。
	
我们可以使用线程对象的getState()方法来获得线程的状态信息。

The state of the thread:

1.处于阻塞状态的线程,一旦阻塞事件消失或者结束,线程将归为到“可运行状态”,而不是直接进入运行状态。
	
2.当线程处于“同步锁”状态时,即一个包含同步方法(用synchronized修饰)的线程被CPU调用,其他线程就
无法调用相同对象的同步方法。当一个线程在一个同步方法的内部,所有试图调用该方法的同实例的其他线程必须
等待该线程的结束。

Interruption of threads:

我们可以通过重置线程的标识位,来使得线程中断。

中断的相关方法:
1.void interrupted():向线程发出中断请求。
2.static boolean interrupted():测试当前线程是否被中断了,会将标识位设置为false。
3.boolean isInterrupted():测试线程是否被终止,并不会重置标志位。

如果要中断一个正在处于阻塞状态的线程时,它是会抛出“线程中断异常InterruptedException”的。

The thread stops:

在开发中想使得一个线程停止的方式,不能使用他们的stop()方法。
	
应该使用表示变量来停止一个线程;就如同设置一个开关一样,传递一个关闭的指令,线程收到这个信号之后
做出不再继续运行的响应。

Daemon thread:

守护线程是优先级别较低的一个默默提供后台服务的线程,若当没有一个线程来用到守护线程的服务的话,这个
守护线程就没有存在的必要了。

方法:
void setDaemon(boolean isDameon);

特点:
当线程只剩下守护线程时,JVM就退出。 

InterruptedThreadDemo class (test thread status, judge thread interruption):

package LessonForThread04;

import java.lang.Thread.State;

public class InterruptedThreadDemo 
{
    
    

	public static void main(String[] args)
	{
    
    
		//Lambda表达式
		Thread t1 = new Thread(()->{
    
    
			for (int i=0; i<10; i++)
			{
    
    
				System.out.println("t1 -- "+i);
				try 
				{
    
    
					Thread.sleep(200);
				} catch (InterruptedException e) 
					{
    
    
						e.printStackTrace();
					}
			}
		});
		State s1 = t1.getState();//获得t1状态值NEW
		System.out.println(s1.name());
		
		t1.start();
		t1.interrupt();//请求t1线程中断。
		boolean b1 = t1.isInterrupted();
		System.out.println(b1);
		//此时抛出了异常但是没有中断。
		//很多情况下interrupt方法是没办法中断线程的。
		   
		State s2 = t1.getState();//获得t1状态值:RUNNABLE
		System.out.println(s2.name());
		
		//主线程代码
		for (int i=0; i<10; i++)
		{
    
    
			System.out.println("main -- "+i);
			try 
			{
    
    
				Thread.sleep(300);
			} catch (InterruptedException e) 
				{
    
    
					e.printStackTrace();
				}
		}
	}
}

KillToStopThread class (test interrupt thread, daemon thread):

package LessonForThread04;

class MyThread extends Thread
{
    
    
	private boolean kill = false;
	
	public void setKill(boolean kill)
	{
    
    
		this.kill = kill;
	}
	
	public void run()
	{
    
    
		int i = 0;
		while (true)
		{
    
    
			if (kill == true)
			{
    
    
				break;
			}
			
			try 
			{
    
    
				Thread.sleep(200);
			} catch (InterruptedException e) 
				{
    
    
					e.printStackTrace();
				}
			System.out.println(i++);
		}
	}
}

public class KillToStopThread 
{
    
    

	public static void main(String[] args) 
	{
    
    
		MyThread mt1 = new MyThread();
		mt1.setDaemon(true);//让mt1成为守护线程
		mt1.start();
		
		//此时,主线程只有一条语句就是休眠1.5秒,休眠期一过主线程就结束了,这时子线程就没有存在的必要了,
		//此时JVM只剩下守护线程的时候守护线程就让JVM关闭了
		try 
		{
    
    
			Thread.sleep(1500);//先让主线程休息一秒钟,给mt1线程运行一秒钟之后再传入true 
		} catch (InterruptedException e) 
			{
    
    
				e.printStackTrace();
			}
		
		mt1.setKill(true);
	}

}

本篇部分文字来源于:
	咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
	在这里十分感谢老师能够给我带来学习的激情。

2020.10.22
可以转载我的学习日记但请注明出处,谢谢。
本文章是本人学习笔记,不进行任何商用!也请别拿去商用!只为记录本人学习历程。
毕	

Guess you like

Origin blog.csdn.net/SIESTA030/article/details/109231886