`
xyheqhd888
  • 浏览: 409253 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

Java线程(二)

阅读更多

1. 线程生命周期:

     线程的4个主要周期状态为创建线程、可执行(Runnable)、非可执行和终止(Dead)。当实例化一个Thread并执行start()之后,线程进入Runnable状态并开始执行run()方法。

     线程有优先权,由1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY),默认是5(Thread.NORM_PRIORITY)。可以使用Thread的setPriority()方法来设定线程的优先权,设定必须在1--10之间,否则会抛出IllegalArgumentException异常。

     如果想让当前的线程礼让一下其他线程,让其他线程有机会取得执行权,可以调用线程执行的yield()方法。例如:

public class SomeClass
{
	//...
	Thread thread = new Thread(
		new Runnable(){
		   public void run() {
			   //...
			   while(true) {
				   //... 
				   yield();  //暂时让出执行权
			   }
		   }
	});
	thread.start();
	//...
}

    有几种状况会让线程进入Not Runnable状态(或是blocked状态):

     (1)  调用sleep()方法

     (2)  调用wait()方法

     (3)  等待输入/输出完成

     当线程在Not Runnable状态时,表示有某些原因阻止它执行(例如等待使用者的文字输入、侦听网络连接等),线程排班器将不分配执行时间给这个线程,直到以下的几个情况让线程回到Runnable状态:

     (1) 线程调用notify()

     (2) 线程调用notifyAll()

     (3) 线程调用interrupt()

     (4) 输入/输出结束

     最后当执行的工作完成(或发生异常)而离开run()方法,则线程执行完毕,进入Dead状态。可以使用isAlive()方法判断线程是否存活

2. 举个简单的例子,当使用Thread.sleep()使线程暂停执行进入Not Runnable状态时,可以使用interrupt()让它离开Not Runnable状态,当使用sleep()暂时进入Not Runnable状态而Interrupt()时,会丢出java.lang.InterruptedException异常对象。如下:

package ysu.hxy;

public class InterrruptDemo
{
	public static void main(String[] args) 
	{
        Thread thread = new Thread(
			new Runnable(){
			public void run()
			{
				try
				{
					//暂停99999ms
					Thread.sleep(99999);
				}
				catch(InterruptedException e)
				{
					System.out.println("I 'm interrupted!!");
				}
			}
		});

		thread.start();
		thread.interrupt();  //立即中断它
	}
}

 如果要暂停线程,但暂停的时间未知,使用sleep()并不是一个好方法。可以使用wait(),然后让别的线程用nofity()或notifyAll()来通知Not Runnable的线程回到Rannable状态。

2. 线程的加入(Join)

    当线程使用join()加入至另一个线程时,另一个线程会等待这个被加入的线程工作完毕,然后再继续它的动作。join()的意思表示将线程加入成为另一个线程的流程之一。使用范例如下:

package ysu.hxy;

public class ThreadA
{
	public static void main(String[] args) 
	{
         System.out.println("ThreadA执行");

		 Thread threadB = new Thread(
		          new Runnable(){
                     public void run(){
                        try
						 {
							System.out.println("Thread B 开始。。。");
							for(int i=0;i<5;i++)
							 {
								Thread.sleep(1000);
								System.out.println("Thread B 执行。。。");
							 }
							 System.out.println("Thread B 即将结束。。。");
						 }
						catch(InterruptedException e)
						 {
							e.printStackTrace();
						 }
					 }
		 });
		 
		 threadB.start();

		try
		{
			//将threadB加入threadA
			threadB.join();
		}
		catch(InterruptedException e)
		{
			e.printStackTrace();
		}

		System.out.println("Thread A 执行!");
	}
}

  程序启动后主线程就开始,在主线程中新建threadB,并在启动threadB后,将之加入主线程的流程之中。所以threadB必须先执行完毕,主线程都会再继续执行它原本的流程。执行结果如下:

                                           D:\hxy>java ysu.hxy.ThreadA
                                           ThreadA执行
                                           Thread B 开始。。。
                                           Thread B 执行。。。
                                           Thread B 执行。。。
                                           Thread B 执行。。。
                                           Thread B 执行。。。
                                           Thread B 执行。。。
                                           Thread B 即将结束。。。
                                           Thread A 执行!

    如果程序中threadB没有使用join()将之加入主线程的流程中,则最后一行显示"ThreadA 执行"的语句会先执行(因为threadB使用了sleep(),这让主线程有机会取得时间来执行)。

3. 为了防止加入的线程执行时间太久,为了防止无止境地等待这个线程工作完毕,可以在join()上指定时间,例如join(10000),表示加入成为流程之一的线程至多处理10S。如果时间到了,加入的线程还没处理完毕,就不理它了,当前的线程可以继续执行原本的工作流程。

4. 线程的停止:如果要停止一个线程的执行,不建议使用stop()来停止一个线程的执行,API中Thread()的Stop方法已被标记为deprecated。所以,要停止一个线程,最好自行实现。

     一个线程要进入Dead状态,就是执行完run()方法。简单地说,如果要停止一个线程的执行,就要提供一个方式让线程

可以完成run()的流程。

     如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记flag来控制循环的执行,以便让循环有机会终止,线程可以离开run()以终止线程。如:

public class SomeClass implements Runnable 
{
	private boolean isContinue = true;
	public void terminate()
	{
		isContinue = false;
	}

	public void run()
	{
		while(isContinue){
			//...some satatements
		}
	}
}

  如果线程因为执行sleep()或者wait()而进入Not Runnable状态,而您想要停止它,可以使用interrupt(),而程序会抛出IterruptedException异常,使用线程离开run()方法。如下例所示:

package ysu.hxy;

public class SomeThread implements Runnable 
{
	public void run()
	{
		System.out.println("sleep...到not runnable状态");
		try
		{
			Thread.sleep(9999);
		}
		catch(InterruptedException e)
		{
			System.out.println(" I am Interrupted...");
		}
	}

	public static void main(String[] args)
	{
		Thread thread = new Thread(new SomeThread());
		thread.start();
		thread.interrupt();
	}
}

   如果程序因为输入/输出的装置等待而停滞(进入Not Runnable状态),基本上必须等待输入/输出的动作完成才能离开Not Runnable状态。无法使用interrupt() 来使得线程离开run()方法,您要提供替代的方法,基本上也是引发一个异常,而这个异常如何引发,要看所使用的输入/输出而定。例如使用readLine()方法在等待网络上的一个信息,此时线程进入Not Runnable直到读到一个信息。让它离开run()方法就是使用close()关闭它的流,这时会引发一个IOException异常而使得线程离开run()方法。例如:

public class Client
{
	private Socket skt;
	//...
	public void terminate()
	{
		skt.close();
	}

	public void run()
	{
	   //...

	   try
		{
		   BufferedReader buf = new BufferedReader(new InputStreamReader(skt.getInputStream()));

		   //读取客户端信息
		   //执行ReadLine()会进入not Runnable状态 
		   //直到读到客户端信息
		   while((userMessage=buf.readLine()) != null)
			{
			   //...
			}
		}
		catch(IOException e)
		{
			System.out.println("线程被终止……");
		}
	}
}

 此例只是个简单示范,实际的设计必须被您的程序功能与I/O类型而定。除了stop()之外,suspend()、resume()方法也被标示为deprecated,如果要达到与这些方法相同的功能,都必须自行实现。

分享到:
评论

相关推荐

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...

    Java线程高清晰中文第二版

    在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件...

    Java线程状态流转图

    Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    Java线程.ppt

    Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    java线程深入解析

    Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    java 线程相关工具类

    java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类....

    java线程入门级书籍

    #### 二、Java线程的使用场景 **2.1 提高用户界面响应速度** 在使用Swing等GUI库时,事件驱动的用户界面需要一个专门的事件线程来处理用户的输入。如果某个事件处理函数(如事件监听器)执行时间过长,会导致用户...

    java线程文档大全

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...

    JAVA线程学习(源代码)

    本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

Global site tag (gtag.js) - Google Analytics