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

[b]1,创建线程,有两种方法[/b]
/**   
*
* 项目名称: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的源码见附件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值