java多线程编程

来源:互联网 发布:人名的名义网络播放量 编辑:程序博客网 时间:2024/06/03 19:37
任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main.只有在程序中建立另外的线程,才能算是真正的多线程程序。也就是说,多线程程序必须拥有一个以上的线程。

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:

 

public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

 

    Runnabletarget

   实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

    Stringname

   线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。

    ThreadGroupgroup

   当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

    longstackSize

   线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB.在x86平台下,默认的线程栈大小是12KB.

   一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。Thread类的start方法不能多次调用,否则会抛出一个IllegalThreadStateException异常。

虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:

 

  001  package mythread;
  
002  
  
003  public class Thread1 extends Thread
  
004  {
  
005      public void run()
  
006      {
  
007          System.out.println(this.getName());
  
008      }
  
009      public static void main(String[] args)
  
010      {
  
011          System.out.println(Thread.currentThread().getName());
  
012          Thread1 thread1 = new Thread1();
  
013          Thread1 thread2 = new Thread1 ();
  
014          thread1.start();
  
015          thread2.start();
  
016      }
  
017  }

 

   上面的代码建立了两个线程:thread1和thread2.上述代码中的005至008行是Thread1类的run方法。当在014和015行调用start方法时,系统会自动调用run方法。在007行使用this.getName()输出了当前线程的名字,由于在建立线程时并未指定线程名,因此,所输出的线程名是系统的默认值,也就是Thread-n的形式。在011行输出了主线程的线程名。

   上面代码的运行结果如下:

 

main
Thread-
0
Thread-
1

 

   从上面的输出结果可以看出,第一行输出的main是主线程的名子。后面的Thread-1和Thread-2分别是thread1和thread2的输出结果。


 

 实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过Runnable接口创建线程分为两步:

    1.将实现Runnable接口的类实例化。

   2. 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法。

   最后通过Thread类的start方法建立线程。

   下面的代码演示了如何使用Runnable接口来创建线程:

 

package mythread;

public class MyRunnable implements Runnable
{
    
public void run()
    {
        System.out.println(Thread.currentThread().getName());
    }
    
public static void main(String[] args)
    {
        MyRunnable t1 
= new MyRunnable();
        MyRunnable t2 
= new MyRunnable();
        Thread thread1 
= new Thread(t1, "MyThread1");
        Thread thread2 
= new Thread(t2);
        thread2.setName(
"MyThread2");
        thread1.start();
        thread2.start();
    }
}

 

   上面代码的运行结果如下:

 

MyThread1
MyThread2
原创粉丝点击