时间:2019-12-14 17:03:42
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
package cn.tx.demo2;
public class SaleTickedThread extends Thread {
private String name;
/**
* 定义共享的数据
*/
static int tickets = 100;
//创建一个锁对象(用静态实现共享)
static Object obj = new Object();
public SaleTickedThread(String name) {
this.name = name;
}
@Override
public void run() {
//卖票是一个持续的动作
while (true){
synchronized (obj){
if(tickets > 0){
System.out.println(name + "卖出的座位号是:"+tickets--);
}else{
break;
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name + "卖票结束");
}
}
启动线程:
package cn.tx.demo2;
public class SaleTest {
public static void main(String[] args) {
SaleTickedThread t1 = new SaleTickedThread("窗口1");
SaleTickedThread t2 = new SaleTickedThread("窗口2");
SaleTickedThread t3 = new SaleTickedThread("窗口3");
SaleTickedThread t4 = new SaleTickedThread("窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
2、实现Runnable接口方式实现多线程
如果自己的类已经继承另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
package cn.tx.demo4;
public class SaleTicked implements Runnable {
//注意这里不是静态了。。
int tickets = 100;
private String name;
//注意这里不是静态了。。
private Object obj = new Object();
@Override
public void run() {
while (true){
synchronized (obj){
if(tickets > 0){
System.out.println(Thread.currentThread().getName() + "卖出的座位是"+(tickets--));
}else{
break;
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
启动线程:
package cn.tx.demo4;
public class SaleTest {
public static void main(String[] args) {
/**
* 用共享对象的方式实现多线程安全
*/
SaleTicked st = new SaleTicked();
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
Thread t4 = new Thread(st, "窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
这种方式只适合于初学,线程池更需要好好研究。