概述
目录
创建一个最简单的线程方法
Java线程的初始化
Java线程的中断
创建一个最简单的线程方法
首先,我们知道启动一个新的线程最简单的方法就是:
- 继承Thread类
- 重写Thread类中的run方法,run()方法内书写具体的执行任务
- 创建对象调用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源码分析】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复