`

jdk6.0从入门到精通-----chapter7线程

阅读更多
1,创建线程,有两种方法
/**   
*    
* 项目名称:ch07   
* 类名称:TestThread   
* 类描述:   
* 创建人:Administrator   
* 创建时间:2010-9-9 上午09:02:40   
* 修改人:Administrator   
* 修改时间:2010-9-9 上午09:02:40   
* 修改备注:   
* @version    
*    
*/ 
package firstthread;
public class TestThread {

	public static void main(String[] args){
		//创建线程两种方式
		//方式1,重载run方法,new Thread()未指定线程名称,由虚拟机指定,一般是Thread-序号
		System.out.println("当前线程名称,优先级 "+Thread.currentThread().getName()+Thread.currentThread().getPriority());
		
		Thread t1 = new Thread(){
			public void run(){
				System.out.println("线程1");
			}
		};
		
		//方式2,新建runnable,实现线程体
		Runnable r = new Runnable(){
			@Override
			public void run() {
				System.out.println("线程2");				
			}
		};
		Thread t2 = new Thread(r);
//		启动线程,主线程会继续运行下面,而不会等待子线程
		t2.setPriority(10); //设置优先级最高,最先运行
		t1.start();
		t2.start();
		System.out.println("线程1 id name "+t1.getId()+t1.getName());//Thread-0
		System.out.println("线程2 id name"+t2.getId()+t2.getName());//Thread-1
		System.out.println("线程1 优先级"+t2.getPriority()); //优先级为1-10,默认为5
		System.out.println("线程1 所属的 线程组 "+t1.getThreadGroup().getName()); //main
		System.out.println("线程组main的活动线程数"+Thread.currentThread().getThreadGroup().activeCount());
//线程组main的活动线程数2
		
	}
}


2,一般不建议使用上面的方法创建线程,而是单独建立一个继承Thread或实现Runnable接口的线程类
利用Thread
package extendsThread;

public class MyMultiThread extends Thread
{
    private int no;
   
    public MyMultiThread(int no)
    {
        this.no=no;
    }
    public void run()
    {
        for(int i=0;i<5;i++)
            System.out.println("\t<"+i+">Hi!我是线程"+no+"!");
        System.out.println("\t线程"+no+"向你说再见...");
    }
}


package extendsThread;

public class UseThread
{
    public static void main(String args[])
    {
        MyMultiThread[] aThreadArray=new MyMultiThread[3];
        System.out.println("使用Thread的多线程程序:\n");
        for(int i=0;i<3;i++)
        {
            aThreadArray[i]=new MyMultiThread(i);
        }
        for(int i=0;i<3;i++)
            aThreadArray[i].start();
        WhileLoop:
        while(true)
        {
            for(int i=0;i<3;i++)
                if(aThreadArray[i].isAlive()) 
                    continue WhileLoop;
            break;
        }
        System.out.println("\t我是main()!Bye bye...");
   }
} 


利用Runnable
package runnable;

public class MyMultiThreadClass implements Runnable
{
    private int no;
    public MyMultiThreadClass(int no)
    {
        this.no=no;
    }
    public void run()
    {
        for(int i=0;i<5;i++)
            System.out.println("\t<"+i+">Hi!我是线程"+no+"!");
        System.out.println("\t线程"+no+"向你说再见...");
    }
}



package runnable;

public class UseRunnable
{
    public static void main(String args[])
    {
        MyMultiThreadClass[] aMTCArray=new MyMultiThreadClass[3]; //runnbale的实例
        Thread[] aThreadArray=new Thread[3];
        System.out.println("使用接口Runnable的多线程程序:\n");
        for(int i=0;i<3;i++)
        {
            aMTCArray[i]=new MyMultiThreadClass(i);
            aThreadArray[i]=new Thread(aMTCArray[i]); //多实例,多线程,不存在安全问题
//            如果一个实例构造多个线程,就存在变量安全问题
        }
        for(int i=0;i<3;i++)
            aThreadArray[i].start();
        WhileLoop:
        while(true)
        {
            for(int i=0;i<3;i++)
                if(aThreadArray[i].isAlive()) 
                    continue WhileLoop;
            break;
        }
        System.out.println("\t我是main()!Bye bye...");
   }
}


3,线程组
package threadgroup;

public class TestThreadGroup
{
    public static void main(String[] args)
    {
        ThreadGroup tg1=new ThreadGroup("thread_group1");
        Thread thread1=new Thread(tg1,"thread1");
        Thread thread2=new Thread(tg1,"thread2");//group,name
        tg1.list();     //打印线程组信息
        tg1.setDaemon(true);
        System.out.println(tg1.getName()+"的父线程组是:"+tg1.getParent().getName());
        thread1.start();
        Thread[] threadArray1=new Thread[tg1.activeCount()];
        tg1.enumerate(threadArray1,false); //将线程组中活动线程放入数组
        System.out.println(tg1.getName()+"的活动线程有:"+threadArray1.length);
        ThreadGroup[] threadGroupArray1=new ThreadGroup[tg1.activeGroupCount()];
        tg1.enumerate(threadGroupArray1,false);
        System.out.println(tg1.getName()+"的活动线程组有:"+threadGroupArray1.length);
        
        ThreadGroup tg2=new ThreadGroup(tg1,"thread_group2");
        Thread thread3=new Thread(tg2,"thread3");
        Thread thread4=new Thread(tg2,"thread4");
        tg2.list();
        tg2.setDaemon(true);
        System.out.println(tg2.getName()+"的父线程组是:"+tg2.getParent().getName());
        Thread[] threadArray2=new Thread[tg2.activeCount()];
        tg2.enumerate(threadArray2,false);
        System.out.println(tg2.getName()+"的活动线程有:"+threadArray2.length);
        ThreadGroup[] threadGroupArray2=new ThreadGroup[tg2.activeGroupCount()];
        tg2.enumerate(threadGroupArray2,false);
        System.out.println(tg2.getName()+"的活动线程组有:"+threadGroupArray2.length);
    }
}


4,守护线程

package daemonThread;
public class TestDaemon {

	//守护线程测试
	public static void main(String[] args) {

		Thread parent = new Thread(){
			public void run(){
				System.out.println("praent starts....");
				//创建子线程
				
				Thread child = new Thread(){
					public void run(){
						System.out.println("child starts....");
						while(true){
							System.out.println("child runs...");
						}
					}
				};
				
				child.setDaemon(true);//false子线程不是守护线程,即父线程终止时,子线程会继续运行
			    child.start();
			}
		};
		parent.start(); //父线程先运行
	}

}


所有chapter7的源码见附件
分享到:
评论

相关推荐

    jdk6.0从入门到精通-----chapter8并发多线程(1)(源码下载)

    本章“jdk6.0从入门到精通-----chapter8并发多线程(1)”着重讲解了Java 6中关于多线程的基本知识和实践技巧。通过源码下载,读者可以更直观地理解多线程的实现方式。 首先,我们要理解什么是多线程。在单线程环境...

    jdk6.0从入门到精通-----chapter17动态编程

    《JDK 6.0从入门到精通——Chapter 17 动态编程》 在Java编程领域,JDK 6.0版本引入了许多新特性,其中动态编程是提升开发效率和灵活性的重要方面。本章将深入探讨动态编程的概念、用途以及如何在JDK 6.0中利用这些...

    jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)

    在Java编程领域,JDK(Java Development Kit)是开发和运行Java应用程序的...总的来说,"JDK6.0从入门到精通-----chapter5网络编程 新I/O"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中获益良多。

    jdk6.0从入门到精通-----chapter18与动态语言结合

    标题中的“jdk6.0从入门到精通-----chapter18与动态语言结合”指的是Java开发工具包(JDK)6.0版本中的一个章节,主要探讨了如何将Java与动态编程语言集成。在Java 6中,引入了一个重要的特性,即Java平台标准版6...

    (源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象

    标题 "(源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象" 提供了我们要探讨的主题,即Java中的输入输出流(I/O Stream)和对象克隆。在这个章节中,我们将深入理解这两个关键概念。 **输入输出流...

    jdk6.0从入门到精通-----chapter4--文件目录操作

    在Java编程语言中,JDK(Java Development Kit)是核心组件,它包含了开发和运行Java应用程序所需的工具和...同时,随着Java版本的更新,如JDK 7和8引入了更多的文件操作改进,开发者也需要持续学习和掌握最新的技术。

    jdk6.0从入门到精通-----chapter16反射机制-spring AOP

    在Java编程领域,JDK6.0是一个重要的版本,它为开发者提供了丰富的特性和改进。本章我们将深入探讨“反射机制”以及如何结合Spring AOP(面向切面编程)进行应用。反射是Java中的一种强大工具,允许程序在运行时检查...

    jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008(微信开发平台开发JDK)

    微信开发平台开发工具 JDK jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    JDK6.0+中文文档-lytim24.part1.rar

    java6.0文档chm版,分成三部分,分别为JDK6.0+中文文档-lytim24.part1.rar、JDK6.0+中文文档-lytim24.part2.rar、JDK6.0+中文文档-lytim24.part3.rar

    开发工具 jdk-8u121-windows-i586

    开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...

    官方JDK6.0中文版

    - 首先,从官方或可信渠道下载JDK 6.0的安装程序。 - 运行安装程序,按照提示完成安装过程。 - 配置环境变量,如JAVA_HOME指向JDK安装目录,PATH添加bin子目录,确保系统能够找到Java命令。 - 检验安装是否成功,...

    JDK6.0u10b32-windows-

    这个是安装开发工具java jdk 有很多用途

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    jdk7 jdk-7u80-linux-x64 网盘下载

    tar -zxvf jdk-7u80-linux-x64.tar.gz ``` 这会创建一个名为`jdk1.7.0_80`的目录,其中包含了JDK的所有文件。 ##### 4.3 设置环境变量 为了让操作系统能够找到JDK,需要将JDK的路径添加到系统的环境变量中。可以...

    JDK-7u80-windows-x64版本

    JDK版本:JDK-7u80-windows-x64版本,即为jdk1.7,此版本会自动安装JRE(Java的一个运行环境).

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    jdk-7u80-windows-x64.exe

    【标题】"jdk-7u80-windows-x64.exe" 指的是Java Development Kit (JDK) 的第7个版本更新80的64位Windows安装程序。JDK是Oracle公司提供的一个用于开发和运行Java应用程序的核心工具集。 【描述】"jdk-7u80-windows...

    jdk-7u80-linux-x64.tar.gz解压,ORACLE JDK1.7 linux x64.zip

    在Linux系统上,JDK通常以压缩包的形式分发,例如"jdk-7u80-linux-x64.tar.gz"和"ORACLE JDK1.7 linux x64.zip"。 首先,我们来看"jdk-7u80-linux-x64.tar.gz"文件。这是一个gzip压缩过的tar归档文件,"tar"是用于...

Global site tag (gtag.js) - Google Analytics