简述
在程序中,靠一个线程执行任务是比较缓慢的。有时,我们需要开启多线程,并发处理,提高程序的执行效率。
进程和线程
对于一个应用程序而言就是一个进程,当我们打开任务管理器的时候,可以看见每个运行的程序(进程)详情。线程是进程的最小执行单元,一个进程最起码有一个线程(主线程),可能会有多个线程。
实现多线程的两种方式
1.直接继承Thread
创建一个类继承Thread并重写run方法
package MyThread;
public class MyThread extends Thread {
private String host;
private int num=100;
public MyThread() { }
public MyThread(String host) {
this.host = host;
}
@Override
public void run(){
while (num>0){
// try {
// Thread.sleep(10); //线程休眠等待
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println(this.host+"卖出了第"+num--+"张票!");
}
}
}
创建一个测试类
package MyThread;
public class Text {
public static void main(String[] args) {
MyThread qq=new MyThread("QQ"); //创建线程
MyThread weixin=new MyThread("微信");
MyThread zfb=new MyThread("支付宝");
qq.start();//开启线程
weixin.start();
zfb.start();
}
}
运行结果:
对于这个程序,一共有四个线程:main方法(主线程),qq,weixin,zfb。线程有4中状态:创建,就绪(调用start()后线程并不会马上执行,而是抢到CPU的时间片后,才会去执行),执行,阻塞。当我们创建线程后,然后调用start(),并没有直接的去调用run()方法。当我们调用start()就创建了一个线程,如果这个线程抢到CPU的时间片,就可以运行run()中的代码,不需要等待run()运行完毕,其他地方的代码也可以运行。如果直接调用run(),就相当于调用普通方法一样。
2.实现Runnable接口。
实现Runnable接口,并重写run()
package MyThread;
public class Thread_Runnable implements Runnable {
private String host;
private int num=100;
public Thread_Runnable() { }
public Thread_Runnable(String host) {
this.host = host;
}
@Override
public void run(){
while (num>0){
System.out.println(this.host+"卖出了第"+num--+"张票!");
}
}
}
测试类
package MyThread;
public class Text {
public static void main(String[] args) {
Thread thread1=new Thread(new Thread_Runnable("QQ"));//Thread构造方法里面有个是传入Runnable对象
Thread thread2=new Thread(new Thread_Runnable("微信"));
Thread thread3=new Thread(new Thread_Runnable("支付宝"));
thread1.start();//开启线程
thread2.start();
thread3.start();
}
}
总结:
对于这两种实现多线程的方式,一般推荐使用第二种(实现Runnable接口),因为Java是单继承,实现接口后,还可以有选择的继承其它类。
每日鸡汤:付出不亚于任何人的努力!
Over!