分类: Java
2008-05-09 14:56:46
Java中的线程包括前台线程(用户线程)和后台线程(守护线程)。当Java程序中只剩下后台线程运行时,整个Java程序随即变退出。相反,但还有前台线程在运行前,整个Java程序仍保持运行。
当线程产生而开始进行的时候,默认是作为前台线程运行的。让线程成为后台线程的方法是:在Thread对象调用start()方法前,先调用Thread对象的setDaemon(true)方法。其中若参数加false则让其成为前台线程之意。
一、创建线程的两种方法
1、继承Thread类,并覆盖Thread类的run()方法,要执行的代码写入子类的run()方法体内。如:
class MyThread extends Thread {
public void run() {
//要执行的代码
}
}
然后创建MyThread的一个对象,并调用它的start()方法(从父类Thread继承而得来的):
Thread t = new MyThread();
t.setDaemon(false); //若想让其成为后台进程则传递true
t.start();
2、Thread(Runnable target) 创建Thread对象时,给Thread构造函数传递一个实现Runnable接口的类。
Thread(Runnable target)
Runnalbe接口只有一个方法,即run()方法。通过new Thread(Runnable target) 创建的Thread对象start()时调用的对象参数对应的run(),而不是Thread本身默认的run()。
具体做法如下:
class MyThread implements Runnable {
public void run() {
//要执行的代码
}
}
...
Thread t = new Thread(new MyThread());
t.start();
二、两种线程的例子
举个例子:比如有4个售票窗口要共同卖10张票:
1、采用Runnable接口方法
class Aa
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
int tickets = 10;
public void run()
{
while (tickets > 0)
{
System.out.println("TestThread: "
+ Thread.currentThread().getName() + "the tickets = "
+ tickets--);
}
}
}
执行结果:
TestThread: Thread-0the tickets = 10
TestThread: Thread-1the tickets = 9
TestThread: Thread-1the tickets = 8
TestThread: Thread-1the tickets = 7
TestThread: Thread-1the tickets = 6
TestThread: Thread-1the tickets = 5
TestThread: Thread-0the tickets = 4
TestThread: Thread-1the tickets = 3
TestThread: Thread-0the tickets = 2
TestThread: Thread-2the tickets = 1
就相当于采用了线程同步
2、采用继承Thread类的方法
class Aa
{
public static void main(String[] args)
{
TestThread tt1 = new TestThread();
new Thread(tt1).start();
new Thread(tt1).start();
new Thread(tt1).start();
new Thread(tt1).start();
}
}
class TestThread extends Thread
{
int tickets = 10;
public void run()
{
while (tickets > 0)
{
System.out.println("TestThread: "
+ Thread.currentThread().getName() + "the tickets = "
+ tickets--);
}
}
}
执行结果:
TestThread: Thread-1the tickets = 10
TestThread: Thread-3the tickets = 9
TestThread: Thread-1the tickets = 8
TestThread: Thread-1the tickets = 7
TestThread: Thread-1the tickets = 5
TestThread: Thread-1the tickets = 3
TestThread: Thread-1the tickets = 1
TestThread: Thread-3the tickets = 6
TestThread: Thread-4the tickets = 2
TestThread: Thread-2the tickets = 4
三、联合线程
t.join()的作用是将线程t合并到调用join()方法的当前线程中。说白了就是,t线程的代码不执行完,当前线程中的代码就只能一直等待。
join()方法可带一表示合并时间的参数N,单位为毫秒。意思是N毫秒之后又恢复到合并前的状态。