多线程---线程的建立

1、定义线程
 
一、继承java.lang.Thread类。
 
此类中有个run()方法,应该注意其用法:
public void run()
若是该线程是使用独立的  Runnable 运行对象构造的,则调用该  Runnable 对象的  run 方法;不然,该方法不执行任何操做并返回。
 
Thread 的子类应该重写run()方法。
二、实现java.lang.Runnable接口。
 
void  run()
使用实现接口  Runnable 的对象建立一个线程时,启动该线程将致使在独立执行的线程中调用对象的  run 方法。
 
方法  run 的常规协定是,它可能执行任何所需的操做。
 
2、实例化线程
 
一、若是是扩展java.lang.Thread类的线程,则直接new便可。
 
二、若是是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target) 
Thread(Runnable target, String name) 
Thread(ThreadGroup group, Runnable target) 
Thread(ThreadGroup group, Runnable target, String name) 
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
 
3、启动线程
 
在线程的Thread对象上调用start()方法。
 
在调用start()方法以前:线程处于新状态中,新状态指有一个Thread对象,但尚未一个真正的线程。也就是说在这个地方只是建立了一个线程,可是并无启动线程。
 
在调用start()方法以后:发生了一系列复杂的事情
启动新的执行线程(具备新的调用栈);
该线程重新状态转移到可运行状态;
当该线程得到机会执行时,其目标run()方法将运行。
 
注意:对Java来讲,run()方法没有任何特别之处。像main()方法同样,它只是新线程知道调用的方法名称(和签名)。所以,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
 
 
4、例子
 
一、实现Runnable接口的多线程例子
/** 
* 实现Runnable接口的类 

*/
 
public  class DoSomething  implements Runnable { 
     private String name; 

     public DoSomething(String name) { 
         this.name = name; 
    } 
    //重写run方法
     public  void run() { 
         for ( int i = 0; i < 5; i++) { 
             for ( long k = 0; k < 100000000; k++) ; 
            System.out.println(name +  ": " + i); 
        } 
    } 
}
 
/** 
* 测试Runnable类实现的多线程程序 

*/
 
public  class TestRunnable { 
     public  static  void main(String[] args) { 
        Thread t1 =  new Thread( new  DoSomething( "阿三" )); 
        Thread t2 =  new Thread( new  DoSomething( "李四" )); 
        //此处开启线程
        t1.start(); 
        t2.start(); 
    } 
}
 
执行结果:
李四: 0 
阿三: 0 
李四: 1 
阿三: 1 
李四: 2 
李四: 3 
阿三: 2 
李四: 4 
阿三: 3 
阿三: 4 

 
二、扩展Thread类实现的多线程例子
 
/** 
* 测试扩展Thread类实现的多线程程序 

* @author leizhimin 2008-9-13 18:22:13 
*/
 
public  class TestThread  extends Thread{ 
     public TestThread(String name) { 
         super(name); 
    } 

     public  void run() { 
         for( int i = 0;i<5;i++){ 
             for( long k= 0; k <100000000;k++); 
            System.out.println( this.getName()+ " :"+i); 
        } 
    } 

     public  static  void main(String[] args) { 
        Thread t1 =  new TestThread( "阿三"); 
        Thread t2 =  new TestThread( "李四"); 
        t1.start(); 
        t2.start(); 
    } 
}
 
执行结果:
阿三 :0 
李四 :0 
阿三 :1 
李四 :1 
阿三 :2 
李四 :2 
阿三 :3 
阿三 :4 
李四 :3 
李四 :4 
 
对于上面的多线程程序代码来讲,输出的结果是不肯定的。其中的一条语句for(long k= 0; k <100000000;k++);是用来模拟一个很是耗时的操做的。
 
5、一些常见问题
 
一、线程的名字,Thread.currentThread().getName(),可经过此方法获取线程名称
二、线程均可以设置名字,也能够获取线程的名字,连主线程也不例外。
三、获取当前线程的对象的方法是:Thread.currentThread();
四、在上面的代码中,只能保证:每一个线程都将启动,每一个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来讲,调度程序不能保证其执行次序,持续时间也没法保证。
五、当线程目标run()方法结束时该线程完成。
六、一旦线程启动,它就永远不能再从新启动。只有一个新的线程能够被启动,而且只能一次。一个可运行的线程或死线程能够被从新启动。
七、咱们没有没法控制线程调度程序,但能够经过别的方式来影响线程调度的方式。好比线程等待等
相关文章
相关标签/搜索