一、介绍
多线程的好处是解决了一个进程能同时执行多个任务的问题和提高了资源的利用率,缺点是增加cpu的负担、引发了线程安全问题、降低了一个进程中线程的执行概率、出现了死锁现象等,尽管多线程有一定的缺点,不过总的来说多线程的实现是利大于弊的。
二、多线程的实现
(1)实现Runnable接口
下面以一个简单的多窗口售票程序来演示实现Runnable接口的多线程的实现
public class Tickets implements Runnable{
public static int tickets=10;//10张票
@Override
public void run() {
while(true) {
synchronized ("aa") {//加重量锁实现线程安全
if(tickets>0) {
System.out.println(Thread.currentThread().getName()+"第"+tickets+"张票");
tickets--;
}else {
System.out.println("票售尽");
break;
}
}
}
}
}
测试:
public static void main(String[] args) {
Tickets tickets = new Tickets();
Thread thread1 = new Thread(tickets);//创建线程
Thread thread2 = new Thread(tickets);
Thread thread3 = new Thread(tickets);
thread1.start();//启动线程
thread2.start();
thread3.start();
}
实现效果:
(2)继承Thread类
public class Tickets extends Thread{
public static int tickets=10;//10张票
@Override
public void run() {
while(true) {
synchronized ("aa") {//加重量锁实现线程安全
if(tickets>0) {
System.out.println(Thread.currentThread().getName()+"第"+tickets+"张票");
tickets--;
}else {
System.out.println("票售尽");
break;
}
}
}
}
}
测试:
public static void main(String[] args) {
Tickets ticket1 = new Tickets();//创建线程
Tickets ticket2 = new Tickets();
ticket1.start();//启动线程
ticket2.start();
}
效果:
以上便是多线程的二种实现方式,注意效果图展示的执行结果不唯一。
总结:两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,而实现是多实现,如果继承了Thread类就无法再继承其他类了,而采用实现Runnable接口则更为灵活。