继承Thread方式创建子线程
1.创建一个继承Thread的子类
2.重写Thread类的run()方法,实现子线程要完成的功能
3.在主线程类中创建一个子线程类的对象
4.调用子线程类的start()方法,启动此子线程(实际上start()方法是调用了该类的run()方法)
package TestThread;
public class GeneticThreadWindow extends Thread{
static int ticket=100;
public void run(){
while(true){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+"卖票,票号:"+ticket--);
else
break;
}
}
}
package TestThread;
public class TestWindow {
public static void main(String[] args) {
GeneticThreadWindow w1=new GeneticThreadWindow();
GeneticThreadWindow w2=new GeneticThreadWindow();
GeneticThreadWindow w3=new GeneticThreadWindow();
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();
}
}
注:子线程类的start()方法只能启动一次。不能通过调用子线程类的run()方法来启动子线程,因为这样没有初始化线程的执行。
线程中常用的方法
1. start():启动线程并执行相应的run()方法
2. run():子线程要执行的代码放到run()方法中
3. currentThread():静态方法,获取到当前的线程
4. getName():获取线程的名字
5. setName():设置线程的名字
6. yield():释放当前CPU的执行权
7. join():在A线程中调用B线程的join方法表示当调用此方法时,A线程停止执行,直到B线程执行完毕,A线程才继续执行。(插队)
8. isAlive():判断线程是否存活
9. sleep(long l):显示地让当前线程睡眠l毫秒
10. 线程通信:wait() notify() notifyAll()
11. getPriority():
12. setPriority():优先级最大为10,最小为1。Thread.MAX_PRIORITY就是10,Thread.MIN_PRIORITY
设置了优先级,使得线程抢到CPU使用权的概率变大,并不是优先级高执行完优先级低的再执行。
创建匿名类线程:
new Thread(){
public void run() {
// compute primes larger than minPrime
}
}.start();
实现Runnable方式创建子线程
1. 创建一个实现Runnable接口的类
2. 实现Runnable的抽象方法run()
3. 创建一个Runnable接口实现类的对象
4. 将此对象作为形参传递给Thread类的构造器,创建Thread对象,此对象即为一个线程
5. 调用线程的start()方法:启动线程
package TestThread;
public class ImplementsThreadWindow implements Runnable {
int ticket=100;
@Override
public void run() {
while(true){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+"卖票,票号:"+ticket--);
else
break;
}
}
}
package TestThread;
public class TestWindow {
public static void main(String[] args) {
(new TestWindow()).TestWin2();
}
public void TestWin2(){
ImplementsThreadWindow p = new ImplementsThreadWindow();
Thread w1=new Thread(p);
Thread w2=new Thread(p);
Thread w3=new Thread(p);
w1.start();
w2.start();
w3.start();
}
}
两种创建方式的对比
1. 联系:public class Thread extends Object implements Runnable
2. 哪一种方式好?实现的方式优于继承的方式。因为a.实现的方式避免了单继承的局限性,可以集成一个类,然后再继承Runnable接口。 b.多个线程操作同一份资源,更适合使用实现的方式。
线程的生命周期