java多线程编程(三)- 线程的创建
一:线程说明
1,Java虚拟机允许应用程序并发的运行多个执行线程。
2,线程都有自己的优先级,新线程会继承创建它的线程优先级。
3,线程可以为守护线程和用户线程,如java资源回收线程为守护线程。当且仅当创建线程为守护线程时,新程序才是守护线程。
个人总结:
a:创建新线程只能通过Thread类或其子类,但可以通过实现Runnable接口和Callable接口写具体的执行代码。
b:新创建的线程只能通过start()方法启动,而Runnable接口无start()方法,因此需借助Thread类才能创建;
二:Thread类
1, java.lang.Thread类的继承关系
上图为 java.lang.Thread类的继承关系,Thread类实现了java.lang.Runnable接口。
2,java.lang.Thread类的构造方法
从java.lang.Thread类的构造方法中,看出:
a:可以创建新线程时命名。
b:可以将实现Runnable接口的类作为参数,传入新线程。
c:可以将新线程加入线程组,具体应用待研究。
3,java.lang.Thread类创建新线程
通过继承Thread类,并重写run()方法可以创建新线程对象,使用该对象start()方法启动线程。
1 package com.thread.www; 2 3 class PrimeThread extends Thread{ 4 public PrimeThread(String thName) { 5 this.setName(thName); 6 } 7 8 @Override 9 public void run() { 10 System.out.println("线程重要属性如下:"); 11 System.out.println(" run 线程ID ="+this.getId()); 12 System.out.println(" run 线程名称 ="+this.getName()); 13 System.out.println(" run 优先级 ="+this.getPriority()); 14 System.out.println(" run 活跃状态 ="+this.isAlive()); 15 } 16 } 17 18 public class Test1NewThread { 19 public static void main(String[] args) { 20 PrimeThread name = new PrimeThread("jack"); 21 22 //启动执行线程 23 name.start(); 24 } 25 }
NewThread1
执行结果:
二:Runable接口
java.lang.Runable接口是为了执行代码提供一个公共协议。大多数情况下,如果不需要重写Thread类中除run()的其它方法,用这种方式创建新线程,需要:
a:创建实现java.lang.Runnable接口的对象,重写run()方法。
b:创建Thread类或其子类的对象,一般是用Thread类的对象,并且将a中创建对象作为参数传入该对象构造方法,再使用该对象start()方法启动线程。
1 package com.thread.www; 2 3 class PrimeRun implements Runnable{ 4 5 @Override 6 public void run() { 7 System.out.println("run do .."); 8 } 9 } 10 11 public class Test2NewThread { 12 13 public static void main(String[] args) { 14 //1: 15 PrimeRun name = new PrimeRun(); 16 17 //2:需要创建Thread对象后,name作为参数传入,才能执行name.run() 18 new Thread(name).start(); 19 } 20 } 21 /* 22 * 创建PrimeRun对象,只是建立线程的参数,真正创建线程并启动还需要Thread类或其子类 23 */
NewThread2
三:Callable接口创建执行线程的执行域
通过实现Callable接口方式创建新线程,可以返回的线程运行结果或抛出的异常,具体实现需要:
a:实现java.util.concurrent.Callalbe接口,并重写call()方法。
b:创建java.util.concurrent.FutrueTask类的对象,并将a中创建对象作为参数传入该对象构造方法,FuntrueTask类实现了Runnable接口。
c:创建Thread类或其子类的对象,一般是用Thread类的对象,并将b中创建的对象作为参数传入该对象构造方法,使用该对象start()方法启动线程。
1 package com.thread.www; 2 3 import java.util.concurrent.Callable; 4 import java.util.concurrent.FutureTask; 5 6 class PrimeCall implements Callable<Integer>{ 7 8 //call() 方法区别 run(),可以返回结果,可以抛出异常 9 @Override 10 public Integer call() throws Exception { 11 int sum = 0; 12 for (int i = 0; i < 1000000; i++) { 13 sum +=i; 14 } 15 return sum; 16 } 17 } 18 19 public class Test3NewThread { 20 21 public static void main(String[] args) { 22 int sumCall = 0; 23 //1: 24 PrimeCall pCall = new PrimeCall(); 25 26 //2:Callable未实现Runable,不能直接作为Thread的参数,需要FutureTask过渡以及接收run()返回结果 27 FutureTask<Integer> futureCall = new FutureTask<Integer>(pCall); 28 29 //3:FutureTask实现了Runable,所以可以作为Thread的参数 30 new Thread(futureCall).start(); 31 32 try { 33 sumCall = futureCall.get(); 34 // sumCall = futureCall.get(50, TimeUnit.NANOSECONDS);//可以设置等待结果的超时时间 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 39 System.out.println(sumCall); 40 41 } 42 43 }
NewThread3()
参考资料:https://docs.oracle.com/javase/8/docs/api/
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
https://www.cnblogs.com/baizhanshi/p/6425209.html
原文路径:http://www.cnblogs.com/xiaojia-new/p/8569006.html
转载于:https://www.cnblogs.com/xiaojia-new/p/8569006.html
java多线程编程(三)- 线程的创建相关推荐
- 多线程编程(2): 线程的创建、启动、挂起和退出
python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...
- Java多线程编程(3)--线程安全性
一.线程安全性 一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...
- java多线程编程之线程池技术全面解读
在多线程编程时,创建线程是十分消耗资源的,当线程创建过多时,便会引发内存溢出,因此引入了线程池技术. 目录 线程池的优势 线程池的创建&使用 线程池的工作原理 线程池的参数 功能线程池 线程池 ...
- python多线程编程(2): 线程的创建、启动、挂起和退出
From: http://www.cnblogs.com/holbrook/archive/2012/03/02/2376940.html 如上一节,python的threading.Thread类有 ...
- 小龙:c++多线程编程三(线程参数)
一.传递临时对象作为线程参数 thread第一个参数是线程的开始函数,后面的参数分别表示开始函数的参数.下面看代码: #include <iostream> #include <th ...
- Java 多线程编程 实验题
Java 多线程编程 实验二 1.创建键盘操作练习 2. 双线程猜数字 3. 月亮围绕地球 1.创建键盘操作练习 题目描述: 编写一个Java应用程序,在主线程中再创建两个线程, 一个线程负责给出键盘 ...
- java线程安全例子_Java总结篇系列:Java多线程(三)
本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- Java多线程编程-(4)-线程间通信机制的介绍与使用
上一篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- Java 多线程(三) 线程的生命周期及优先级
Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...
最新文章
- Visual Studio无法调试
- 成功解决getaddrinfo:请求的名称有效,但是找不到请求的类型的数据。(11004
- 【视频】vue生命周期函数
- Flume fan out(扇出)详解
- ubuntu16.04右键没有终端的问题
- java instanceof运算符_java的instanceof运算符
- 线程池和定时器——多线程的自动管理(转载)
- git如何合并指定文件内容_Git合并指定文件到另一个分支
- asp.net安全身份验证
- python数据分析与挖掘实战---chapter8中医证型关联规则挖掘
- 部分常见GIS专业英语词汇
- 引爆Spark大数据引擎的七大工具
- java微信公众号授权登录
- 数据库原理(2)——数据模型与概念模型
- android 市场 上传,安卓市场APP上传流程及审核要求
- cnblogs!I'm comeing!
- uni-app开发微信小程序,H5 关于压缩上传图片的问题
- 乐乐音乐4.0简洁版
- 神经网络-人脸表情识别
- itunes计算机无法启动,解决:Apple移动设备服务无法启动
热门文章
- 学完oracle 再学mysql_一篇文章让Oracle程序猿学会MySql【未完待续】
- MATLAB plot 画多条线段的问题
- pytorch学习率衰减
- 基于高光谱技术的农作物常见病害监测研究
- 【java】Applet显示阶乘结果
- Linux转到Server服务,Linux下安装telnet-server服务
- LSTM和GRU的解析从未如此通俗易懂(动图)
- 获取当前scn号scn1_11.1.1.2 基于SCN的查询(AS OF SCN)
- oracle有几种类型表空间,oracle 数据创建时如何指定表空间类型
- 2020计算机二级取消vb,2020年计算机二级VB模拟试题及答案