我是靠谱客的博主 畅快草莓,这篇文章主要介绍Java线程的初始化与中断【结合Thread源码分析】,现在分享给大家,希望可以做个参考。

目录

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

Java线程的初始化

Java线程的中断


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

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

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

具体代码实现如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//代码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类构造函数的源码:

复制代码
1
2
3
4
5
6
7
8
9
10
//无参构造函数 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } //有参构造函数,name为自定义的线程名称 public Thread(String name) { init(null, null, name, 0); } //还有很多含参构造就不一一说明了......

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//例子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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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线程内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部