我是靠谱客的博主 畅快草莓,最近开发中收集的这篇文章主要介绍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();
}
}

 

最后

以上就是畅快草莓为你收集整理的Java线程的初始化与中断【结合Thread源码分析】的全部内容,希望文章能够帮你解决Java线程的初始化与中断【结合Thread源码分析】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部