`

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的源码见附件
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics