Java线程的初始化与中断【结合Thread源码分析】

目录

创建一个最简单的线程方法

Java线程的初始化

Java线程的中断


创建一个最简单的线程方法

首先,我们知道启动一个新的线程最简单的方法就是:

  1. 继承Thread类
  2. 重写Thread类中的run方法,run()方法内书写具体的执行任务
  3. 创建对象调用start()方法

具体代码实现如下:

//代码1
package cn.itcats.thread.Test1;

public class Demo1 extends Thread{
	
	public void run() {
		System.out.println(getName()+" is running...");
	}
	
	
	public static void main(String[] args) {
		Demo1 demo1 = new Demo1();
		Demo1 demo2 = new Demo1();
		demo1.start();
		demo2.start();
	}
}

运行结果:

Thread-1 is running...
Thread-0 is running...

Java线程的初始化

代码1中:Demo1类继承了Thread类并重写了run(),在创建Demo1()实例的时候,实际上先实例化了Thread类。

因为在调用子类实例化方法时候在构造方法第一行会执行super(),若不理解可查看     《Java实例化子类的过程

此时执行了Thread的无参构造函数,查看Thread类构造函数的源码:

//无参构造函数
public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }


//有参构造函数,name为自定义的线程名称
 public Thread(String name) {
        init(null, null, name, 0);
    }

//还有很多含参构造就不一一说明了......

所以不难理解为什么打印结果名称为Thread-1或Thread-0了...

无论是有参还是无参构造都执行了init方法,下面再来看看init方法具体实现和参数的含义:

/**ThreadGroup:线程组,用于对线程进行分组,它是一种树状结构。ThreadGroup常用方法有activeCount()活跃的线程数量,getName()线程组的名字,getParent()获取父节点线程组。
   Runnable:线程任务
   name:线程名字
   stackSize:栈的大小
*/

private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize) {
        init(g, target, name, stackSize, null, true);
    }


    /*关于stackSize的英文注释,未指定默认为0
     * The requested stack size for this thread, or 0 if the creator did
     * not specify a stack size.  It is up to the VM to do whatever it
     * likes with this number; some VMs will ignore it.
     */
    private long stackSize;

关于setDaemon(boolean on)设置线程守护,true为开启线程守护。所守护的线程(主线程)结束,setDaemon()所属线程不管运行是否完毕,伴随主线程的结束而结束。

例子2:

//例子2
package cn.itcats.thread.Test1;

public class Demo1 extends Thread{
	
	public void run() {
		while(true) {
			System.out.println(getName()+" is running...");
		}
	}
	
	
	public static void main(String[] args) throws InterruptedException {
		Demo1 demo1 = new Demo1();
		Demo1 demo2 = new Demo1();
		
		//伴随main方法结束而结束
		demo1.setDaemon(true);
		demo2.setDaemon(true);
		
		demo1.start();
		demo2.start();
		Thread.sleep(2000);
	}
}

虽run方法未执行完毕,但main方法在运行2s多后结束,run方法也伴随结束。

以上就是线程的初始化过程

Java线程的中断

java某个线程或者线程组在执行的过程中,想让程序进行中断,不再往后执行。

使用方法interrupt()——中断线程   jdk1.6后的方法,之前用stop()中断线程(已过期的方法),因为使用这种方式中断线程,获取的锁或其它资源未被释放,只是让被stop()线程无限期等待,推荐使用interrupt()。

使用静态方法interrupted()——查看当前线程是否被中断,返回值boolean

例子3:

package cn.itcats.thread.Test1;

public class Demo1 extends Thread{
	
	public void run() {
		//检测线程的中断状态,非中断才执行
		while(!interrupted()) {
			System.out.println(getName()+" is running...");
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public static void main(String[] args) throws InterruptedException {
		Demo1 demo1 = new Demo1();
		Demo1 demo2 = new Demo1();
		
		demo1.start();
		demo2.start();
		//实际上把demo1方法所属线程改为中断状态
		demo1.interrupt();
	}
}

猜你喜欢

转载自blog.csdn.net/itcats_cn/article/details/81149730