音乐播放器就是一个进程,QQ也是一个进程,一个进程当中可以有多个线程。一个CPU同一时间只能做一件事,但是在很小的时间间隔内交替就可以给人同时执行多个程序的感觉
设置一个进程的开销较大,并且进程之间不允许互相访问内存,通信较为困难,所以,创建进程的开销就要小得多。
实现多线程得方法有两种,一个是继承 Thread类,一个是实现Runnable接口。不管是哪个,都需要重写run方法。
继承Thread类的示例:
class MyThread extends Thread
{
@Override
public void run()
{
//线程的代码
}
}
public class Test1{
public static void main(String[] args){
MyThread mythread=new MyThread();
mythread.start();//启动线程
}
}
实现Runnable类示例:
class MyThread implements Runnable{
public void run(){
//线程代码
}
}
public class Test2{
public static void main(String[] args){
MyThread t=new MyThread();
new Thread(t).start();//启动线程
//或者
new Thread(t,"String").start();//启动线程并命名
}
}
两种方法相比,实现Runnabke接口可以较好的实现线程间数据的共享,因为可以用同一个类去创建多个线程,每个线程都可以存取该类中的数据。
比如:
public class test {
public static void main(String[] args) {
MyThread t=new MyThread();
new Thread(t,"thread1").start();
new Thread(t,"thread2").start();
new Thread(t,"thread3").start();
}
}
class MyThread implements Runnable {
private int i = 1000;
public void run() {
while (i >= 0) {
System.out.println(Thread.currentThread().getName()+" "+i);
i--;
}
}
}
运行结果如下:
thread2 6
thread1 3
thread3 4
thread1 1
thread2 2
thread3 0
thread1 3
thread3 4
thread1 1
thread2 2
thread3 0
从这里可以看到,thread1,thread2,thread3三个线程共享了MyThread类中的i变量。
这有着重要的意义,比如多个火车售票点同时卖票,当然要共享一个库存,否则明明已经没票了但有的售票点却还在卖票。