java多线程w3c_Java创建多线程的三种方式
前言
这篇文章主要讲述线程的概念、组成、Java创建多线程的三种方式以及线程的类型。
线程概念
线程和进程的区别
**进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控制块)、栈、程序、数据组成。
线程:是一个进程中的程序代码的一个执行序列,被认为是带有自己的程序代码和数据的虚拟处理机的封装,其由处理机、代码、数据三部分组成,你可以这样理解线程是在进程内部同时做的事情,比如你在qq音乐应用里可以一边听音乐、同时下载音乐。这就是由多线程来实现的。(一个进程至少包含一个或者多个线程)
注意:
每个Java程序都有一个隐含的主线程,即main()方法,要实现多线程必须在主线程中创建新的线程,Java语言使用Thread类及其子类的对象来表示线程;
一个虚拟处理机封装在java.lang.Thread类中,它控制着整个线程的运行;CPU执行的代码传递给Thread类,由Thread类控制顺序执行;处理的数据传递给Thread类,是在代码执行的过程中所要处理的数据。代码和数据可以由多个线程共享,也可以不被共享,代码和数据是相互独立的,当两个线程共享同一个类的实例时,他们就共享相同的代码;当两个线程共享一个公共对象的存取时,他们就共享相同的数据。
线程的生命周期
一个线程从它被创建到停止执行要经历一个完整的生命周期,在这个生命周期中有4种不同的状态。
①New(新) ②Runnable(可运行) ③Blocked(被阻塞) ④Dead(死亡)
创建线程的三种方式
通过继承Thread类
package thread;
public class ThreadTest extends Thread{
String threadName;
public ThreadTest1(String s){
System.out.println("Making thread:"+s);
threadName = s;
}
public void run(){
for( int i = 0; i < 3; i++ ){
System.out.println("Running thread number =" + threadName);
try {
Thread.sleep(1000); //线程睡眠1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//主线程,操作系统调度每个线程执行
public static void main(String[] args){
ThreadTest1 thread1 = new ThreadTest1("Tom"); //线程1Tom
ThreadTest1 thread2 = new ThreadTest1("Jack"); //线程2Jack
/**线程启动,不是直接调用 run() 方法,而是调运线程类 Thread 的 start() 方法,
*在 Thread 方法内部会调用本地系统方法,最终会自动调用自己线程类的 run()方法。
**/
thread1.start();
thread2.start();
System.out.println("End of main");
}
}
运行截图
通过实现Runnable接口
package thread;
public class ThreadTest implements Runnable{
String threadName;
public ThreadTest(String s){
System.out.println("Making thread:"+s);
threadName = s;
}
public void run(){
for( int i = 0; i < 3; i++ ){
System.out.println("Running thread number =" + threadName);
try {
Thread.sleep(1000); //让线程睡眠1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//主线程,操作系统调度每个线程执行
public static void main(String[] args){
//创建线程Tom和线程Jack
Thread thread1 = new Thread(new ThreadTest("Tom"));
Thread thread2 = new Thread(new ThreadTest("Jack"));
/**线程启动,不是直接调用 run() 方法,而是调运线程类 Thread 的 start() 方法,
*在 Thread 方法内部会调用本地系统方法,最终会自动调用自己线程类的 run()方法。
**/
thread1.start();
thread2.start();
System.out.println("End of main");
}
}
运行截图
通过实现Callable接口
package thread;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class ThreadTest implements Callable{
String threadName;
public ThreadTest(String s) {
System.out.println("Making thread:"+s);
threadName = s;
}
@Override
public Integer call() throws Exception {
int sum = 0;
// TODO Auto-generated method stub
for( int i = 0; i < 5; i++ ){
System.out.println(threadName+i);
sum += i;
}
return sum;
}
public static void main(String args[]){
//创建两个线程,并且启动
ThreadTest threadTest1 = new ThreadTest("Tom");
ThreadTest threadTest2 = new ThreadTest("Jack");
FutureTask result1 = new FutureTask<>(threadTest1);
new Thread(result1).start();
FutureTask result2 = new FutureTask<>(threadTest2);
new Thread(result2).start();
}
}
运行截图
线程类型分类
java中线程一共有两种类型,守护线程和用户线程,用户线程又叫非守护线程。
守护线程
可以通过thread.setDaemon(true)方法设置线程是否为守护线程,thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出IllegalThreadStateException异常。在守护线程中开启的新线程也是守护线程。守护线程顾名思义是用来守护的,是给所有的非守护线程提供服务的,所以在JVM执行完所有的非守护线程后,JVM就会停止,守护线程也不在运行,最典型的守护线程就是java的垃圾回收机制(GC)。
非守护线程
java线程默认设置为非守护线程thread.setDaemon(false)。当主线程运行完之后,只要主线程里有非守护线程JVM就互惠退出,直到所有的非守护线程执行完之后JVM才会退出。、
> 总结:如果把一个线程设置成守护线程,则JVM的退出就不会关心当前线程的执行状态。
java多线程w3c_Java创建多线程的三种方式相关推荐
- java的如何创建js_[Java教程]JS创建事件的三种方式(实例)
[Java教程]JS创建事件的三种方式(实例) 0 2016-05-11 14:00:16 1.普通的定义方式 οnclick="Sfont=prompt('请在文本框中输入红色','红色' ...
- java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)
1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...
- Java创建线程的三种方式
一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...
- java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现
工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...
- java 创建数组的三种方式及区别
创建数组的三种方式:其实分为2类,一种是静态的创建,如方式一.一种是动态的创建,只不过根据写法的不同分为方式二和方式三: // 数组初始化的三种方式//1.声明,分配空间并赋值int[] arr0 = ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- 把对象的创建交给spring来管理—— 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期
把对象的创建交给spring来管理 spring对bean的管理细节 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期 创建Bean的三种方式 ...
最新文章
- win10 VMware15 安装 CentOS6.4 64位(慢慢弄吧,别急)
- python百题百练 二级题目_计算机二级有必要考吗
- Intellij Idea2016.3 svn服务器拉取代码
- 12_02_Linux软件管理之二rpm
- K8s-V1.17.6支持GPU
- Django基础必备三件套: HttpResponse render redirect
- android webview file,Android WebView 不支持 H5 input type=file 解决方法
- Zookeeper C API 基本常量和结构体介绍
- 怎么分析linux的内核程序,Linux内核分析(供参考)
- 数学竖式排版中不为人知的技巧
- 研磨设计模式--外观模式
- 阿拉伯数字转换大写例如:120转一百二十
- 乌龟Git误点跳过工作树的解决方法
- python使用什么来体现代码之间的逻辑关系,Python使用缩进来体现代码之间的逻辑关系。...
- r610服务器维修,戴尔服务器R610
- DES算法的介绍和实现(转的,其实3des一样的原理就是加密解密加密而已)
- python 多因素方差分析_多因素方差分析估计平方和的三种方法
- ipad出现support.apple.com
- 北大张铭教授:基于知识图谱的机器学习
- 计算机学术英语演讲,学术英语写作与演讲