• 继承Thread类创建线程类

步骤:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run()方法称为线程执行体。
  2. 创建Thread子类的实例,即创建了线程对象。
  3. 调用线程对象的start()方法来启动该线程。
1 public class FirstThread extends Thread { 2 private int i ; 3 public void run() 4 { 5 for(;i < 100 ;i++) 6 { 7 System.out.println(getName() + " " + i); 8 } 9 } 10 public static void main(String[] args) { 11 for(int i = 0 ; i < 100; i++) 12 { 13 System.out.println(Thread.currentThread().getName() + " " + i); 14 if(i == 20) 15 { 16 System.out.println("--------线程1开始--------"); 17 new FirstThread().start(); 18 System.out.println("--------线程2开始--------"); 19 new FirstThread().start(); 20 } 21 } 22 } 23 24 }

进行多线程编程时不要忘了Java程序运行时默认的主线程,main()方法的方法体就是主线程的线程执行体。

i变量是FirstThread的实例属性,而不是局部变量,但因为程序每次创建线程对象时都需要创建一个FirstThread对象,所有Thread-0和Thread-1不能共享该实例属性。

使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。

  • 实现Runnable接口创建线程类

步骤:

  1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()的方法体同样是该线程的线程执行体。
  2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。代码如下所示:
1 SecondThread st = new SecondThread(); 2 new Thread(st).start();

也可以在创建Thread对象时为该Thread对象指定一个名字,代码如下所示:

1 SecondThread st = new SecondThread(); 2 new Thread(st,"新线程1").start();

1 2 public class SecondThread implements Runnable { 3 private int i; 4 @Override 5 public void run() { 6 // TODO Auto-generated method stub 7 for(;i < 100 ;i++) 8 { 9 System.out.println(Thread.currentThread().getName() + " " + i); 10 } 11 12 } 13 14 /** 15 * @param args 16 */ 17 public static void main(String[] args) { 18 // TODO Auto-generated method stub 19 for(int i = 0 ; i < 100 ;i++) 20 { 21 System.out.println(Thread.currentThread().getName() + " " + i ); 22 if(i == 20) 23 { 24 SecondThread st = new SecondThread(); 25 new Thread(st,"新线程1").start(); 26 new Thread(st,"新线程2").start(); 27 } 28 } 29 30 } 31 32 } 33 34

上面程序中的代码创建了两个Thread对象,并调用start()方法来启动这两个线程。在FirstThread和SecondThread中创建线程对象的方式有所区别:前者直接创建的Thread子类即可代表线程对象;后者创建的Runnable对象只能作为线程对象的target。

两个子线程的i变量是连续的,也就是采用Runnable接口的方式创建的多个线程可以共享线程类的实例属性。这是因为在这种方式下,程序所创建的Runnable对象只是线程的target,而多个线程可以共享一个target,所以多个线程可以共享一个线程类(实际上应该是线程的target类)的实例属性。

  • 使用Callable和Future创建线程

从Java 5 开始,Java提供了Callable接口,该接口怎么看都像是Runnable接口的增强版,Callable接口提供了一个call()方法。问题是:Callable接口是Java 5新增的接口,而且它不是Runnable接口的子接口,所以Callable对象不能直接作为Thread的target。而且call()方法还有一个返回值——

call()方法并不是直接调用,它是作为线程执行体被调用的。

步骤:

  1. 创建Callable接口实现类,并实现call()方法,该call(0方法有返回值。
  2. 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
  3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。
  4. 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
1 import java.util.concurrent.Callable; 2 import java.util.concurrent.ExecutionException; 3 import java.util.concurrent.FutureTask; 4 5 6 public class ThirdThread implements Callable<Integer> { 7 8 @Override 9 public Integer call() throws Exception { 10 // TODO Auto-generated method stub 11 int i = 0; 12 for(; i < 100 ; i++ ) 13 { 14 System.out.println(Thread.currentThread().getName() + "的循环变量i的值:" + i); 15 } 16 return i; 17 } 18 19 /** 20 * @param args 21 */ 22 public static void main(String[] args) { 23 // TODO Auto-generated method stub 24 ThirdThread rt = new ThirdThread(); 25 FutureTask<Integer> task = new FutureTask<Integer>(rt); 26 for(int i = 0 ;i < 100 ;i++) 27 { 28 System.out.println(Thread.currentThread().getName()+ "的循环变量i的值:" + i); 29 if(i == 20) 30 { 31 new Thread(task,"有返回值的线程").start(); 32 } 33 } 34 try { 35 System.out.println("子线程的返回值:" + task.get()); 36 } catch (InterruptedException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } catch (ExecutionException e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 44 45 } 46 47 } 48

上面程序中创建Callable()实现类与创建Runable实现类并没有太大的差别,只是Callable的call()方法允许声明抛出异常,而且允许带返回值。

程序先创建一个Callable实现类的实例,然后将该实例包装成一个FutureTask对象。

转载于:https://www.cnblogs.com/zcr3108346262/p/6039393.html

2016/11/07 线程的创建和启动相关推荐

  1. python 中主线程结束 子线程还在运行么_python 线程之一:线程的创建、启动及运行方式

    threading:这个模块在较低级的模块 _thread 基础上建立较高级的线程接口 以后我们就用 threading 模块来管理线程就可以了. Tread 类:控制线程创建.启动及运行方式 一.线 ...

  2. java线程的创建和启动深度解析

    线程的创建和启动 java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例. java创建线程有三种方法: 一:继承Thread类创建线程类 通过Thread类来创建并 ...

  3. 线程的创建与启动——Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable)||多线程运行结果是随机的

    线程的创建与启动 在 Java 中,创建一个线程就是创建一个 Thread 类(子类)的对象(实例). Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable).对应 ...

  4. Java的知识点25——程序、进程与线程 || 线程的创建和启动

    程序.进程与线程 进程的特点:动态性.并发性.独立性 并发和并行的区别 并发:多个CPU同时执行多个任务 并行:一个CPU(采用时间片)同时执行多个任务 注:很多多线程是模拟出来的,真正的多线程是指有 ...

  5. Java线程:创建与启动

    Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runna ...

  6. java线程 创建与启动_浅析Java中线程的创建和启动

    前言 线程是一个程序内部的顺序控制流.cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.就像你的时间分成几片,这样整体看来做事情有规律, ...

  7. 多线程编程(2): 线程的创建、启动、挂起和退出

    python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...

  8. java runnable 启动_Java多线程:线程的创建与启动

    # 面试题: Java中创建线程有几种方式. 不同的创建方式有什么区别. 如何启动一个线程. # Java中创建线程的方式 JDK源码中的描述:两种 image.png 第一种是继承Thread类,重 ...

  9. python多线程编程(2): 线程的创建、启动、挂起和退出

    From: http://www.cnblogs.com/holbrook/archive/2012/03/02/2376940.html 如上一节,python的threading.Thread类有 ...

最新文章

  1. 如何用TF Object Detection API训练交通信号灯检测神经网络?
  2. MFC 重设对话框的尺寸
  3. 润乾设计器连接数据源,ie预览问题
  4. 马云:新型企业想要保持创新力 规模要在60人以内
  5. 【项目实战课】NLP入门第1课,人人免费可学,基于TextCNN的新闻文本分类实战...
  6. java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...
  7. 洛谷 P1469 找筷子
  8. 一名IT经理是如何把项目带崩的。。。
  9. 计算机等级考试二级Python讲座(三)
  10. python 提取网页正文_一篇文章教会你用Python爬取淘宝海量信息,把淘宝商品整理成一个表格...
  11. 【PowerShell】PS中 the fuck 插件(PoShFuck)将 wtf 搜索引擎从 Google 改为 Baidu 或者 Bing
  12. VMware之以太网链接
  13. QT软件开发: 获取CPU序列号、硬盘序列号、主板序列号 (采用wmic命令)
  14. c语言 愚人节题目,愚人节整人题目大全
  15. LaTeX:大于等于号,小于等于号,大于号,小于号
  16. SX1278、SX1276、SX1262的简单详解
  17. 西门子数控机床如何用FTP进行程序传输
  18. 今天我们来聊聊,如何做好第三方系统对接
  19. docker安装nginx镜像
  20. .NET WebApi实现RSA加密与解密,签名与验签

热门文章

  1. Hadoop简介 (资源)
  2. 关于机器学习会议的点评
  3. MySQL HandlerSocket插件 资料
  4. 修改的梅花雪的日期控件。。只是一些小改动
  5. python多进程_Python多任务处理(多进程篇)
  6. 容器与devops_容器和DevOps如何改变杜克大学的IT部门
  7. apache开源项目_众筹开源笔记本电脑,新的Apache项目等
  8. (27)StyleLint—CSS代码格式校验
  9. Bootstrap按钮组中按钮的尺寸
  10. Bootstrap 导航