java线程技术——线程的创建运行终止

简介:

http://blog.chinaunix.net/uid-122937-id-192835.html

1.创建和运行线程
在Java中,多线程的实现有两种方式:
      扩展java.lang.Thread类
      实现java.lang.Runnable接口

(1)扩展Thread类
      Thread Test = new Thread();
      Test.start();

(2)实现Runnable接口
将实现Runnable接口的类实例化      
      Test impelements Runnable;//继承接口,实现run()
 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法。
      Test t = new Test();
      Thread test = new Thread(t);
最后通过Thread类的start方法建立线程。
      test.start();

建议使用runable实现java多线程,不管如何,最终都需要通过thread.start()来使线程处于可运行状态。

2.例:显示线程名称

  1. /**
  2.  * 运行二个线程,显示线程的默认名称.
  3.  * @version V1.0 ,2011-3-24
  4.  * @author xiahui
  5.  */
  6. public class DispTheadName extends Thread {
  7.     public void run() {
  8.         System.out.println(this.getName());
  9.     }
  10.     public static void main(String[] args) {
  11.         System.out.println(Thread.currentThread().getName());
  12.         DispTheadName thread1 = new DispTheadName();
  13.         DispTheadName thread2 = new DispTheadName();
  14.         thread1.start();
  15.         thread2.start();
  16.     }
  17. }
显示结果
  1. main
  2. Thread-1
  3. Thread-0
main是主线程的名子,Thread-1和Thread-2分别是thread1和thread2的输出结果。

3.例:修改线程名称
  1. /**
  2.  * 修改线程的名称
  3.  * @version V1.0 ,2011-3-24
  4.  * @author xiahui
  5.  */
  6. public class ChangeTheadName extends Thread {
  7.     private String who;

  8.     public void run() {
  9.         System.out.println(who + ":" + this.getName());
  10.     }
  11.     public ChangeTheadName(String who) {
  12.         super();
  13.         this.who = who;
  14.     }
  15.     public ChangeTheadName(String who, String name) {
  16.         super(name);
  17.         this.who = who;
  18.     }
  19.     public static void main(String[] args) {
  20.         ChangeTheadName thread1 = new ChangeTheadName("thread1", "MyThread1");//初始化线程名称
  21.         ChangeTheadName thread2 = new ChangeTheadName("thread2");
  22.         ChangeTheadName thread3 = new ChangeTheadName("thread3");
  23.         thread2.setName("MyThread2");//调用线程类的setName()修改名称
  24.         thread1.start();
  25.         thread2.start();
  26.         thread3.start();
  27.     }
  28. }
运行结果
  1. thread2:MyThread2
  2. thread1:MyThread1
  3. thread3:Thread-1
注意:
      在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在 run方法执行完后才会执行setName.如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。

      Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。

4.通过Runnable接口来创建线程
  1. /**
  2.  * create thread by Runnable Interface
  3.  * @version V1.0 ,2011-3-27 
  4.  * @author xiahui
  5.  */
  6. public class RunnableClass implements Runnable
  7. {
  8.     public void run()
  9.     {
  10.         System.out.println(Thread.currentThread().getName());
  11.     }
  12.     public static void main(String[] args)
  13.     {
  14.         RunnableClass t1 = new RunnableClass();
  15.         RunnableClass t2 = new RunnableClass();
  16.         Thread thread1 = new Thread(t1, "MyThread1");
  17.         Thread thread2 = new Thread(t2);
  18.         thread2.setName("MyThread2");
  19.         thread1.start();
  20.         thread2.start();
  21.     }
  22. }
运行结果
  1. MyThread1
  2. MyThread2

5.线程的运行

      线程在建立后并不马上执行run方法中的代码,而是处于等待状态。线程处于等待状态时,可以通过Thread类的方法来设置线程不各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。
      当调用start方法后,线程开始执行run( )中的代码。线程进入运行状态。可以通过Thread类的isAlive方法来判断线程是否处于运行状态。
      当线程处于运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于等待状态,也可能处于停止状态。

6 例:线程的创建、运行和停止
  1. /**
  2.  * 线程的创建、运行和停止.
  3.  * @version V1.0 ,2011-3-27 
  4.  * @author xiahui
  5.  */
  6. public class TheadState extends Thread
  7. {
  8.     public void run()
  9.     {
  10.         int n = 0;
  11.         while (( n) < 1000); 
  12.     }
  13.      
  14.     public static void main(String[] args) throws Exception
  15.     {
  16.         TheadState thread1 = new TheadState();
  17.         System.out.println("isAlive: " thread1.isAlive());
  18.         thread1.start();
  19.         System.out.println("isAlive: " thread1.isAlive());
  20.         thread1.join(); // 等线程thread1结束后再继续执行 
  21.         System.out.println("thread1已经结束!");
  22.         System.out.println("isAlive: " thread1.isAlive());
  23.     }
  24. }
运行结果
  1. isAlive: false
  2. isAlive: true
  3. thread1已经结束!
  4. isAlive: false
7.终止线程
    有三种方法可以使终止线程
    1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
    2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果)。
    3.  使用interrupt方法中断线程。
         使用interrupt方法来终端线程可分为两种情况:
        (1)线程处于阻塞状态,如使用了sleep方法。
        (2)使用while(!isInterrupted()){……}来判断线程是否被中断。
        在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出

8. 例:通过退出标志终止线程
  1. /**
  2.  * 通过退出标志终止线程.
  3.  * @version V1.0 ,2011-3-29 
  4.  * @author xiahui
  5.  */
  6. public class ThreadFlag extends Thread
  7. {
  8.     public volatile boolean exit = false;

  9.     public void run()
  10.     {
  11.         while (!exit)
  12.             System.out.println("运行!");
  13.     }
  14.     public static void main(String[] args) throws Exception
  15.     {
  16.         ThreadFlag thread = new ThreadFlag();
  17.         thread.start();
  18.         sleep(100); // 主线程延迟
  19.         thread.exit = true; // 终止线程thread
  20.         System.out.println("线程退出!");
  21.     }
  22. }
运行结果必定为
  1. 运行!
  2. 运行!
  3. 运行!
  4. 运行!
  5. 运行!
  6. 线程退出!

参考文献
1.java线程指南. http://java.chinaitlab.com/Special/javaline/Index.html
2.线程的生命周期. http://java.chinaitlab.com/line/778850_2.html
3.Java Thread suspend Example. http://www.codingdiary.com/developers/developers/diary/javaapi/java/lang/SampleCode/suspendExampleCode.html

相关文章
|
4天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
5天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)
|
5天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
5天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
5天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。
|
6天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。
|
6天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
26 6
|
6天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
14 1
|
6天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
6 0
|
6天前
|
监控 前端开发 算法
Java技术体系
Java技术体系(韩顺平老师整理)
8 0

热门文章

最新文章