本文是本人阅读Java多线程博客http://lavasoft.blog.51cto.com/62575/27069之后的摘录和自己的一些心得理解,如想了解更多请点击上面的链接
几个概念
(1)java编写的程序都运行在java虚拟机(jvm)中,其中的多任务是通过线程实现的
(2)在单cpu系统中,多个线程同时运行叫做并发,这种系统一般是根据时间片,轮流执行线程的,严格意义上单cpu不能同时运行线程(个人理解,如果不对请指正)
(3)多线程的目的是为了最大限度利用cpu资源
(4)在java中,多线程的实现方式有两类
扩展java.lang.Thread类
实现java.lang.Runnable借口
a)扩展java.lang.Thread类
public class MyThread extends Thread{
public MyThread(String string) {
super(string);
}
public void run(){
System.out.println(getName()+" thread start");
for(int i=0;i<5;i++){
System.out.println(i+" "+getName());
try {
sleep((int)Math.random()*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(getName()+" thread stop");
}
}
------
public class Test{
public static void main(String[] args) throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " thread start");
new MyThread("AAA").start();
new MyThread("BBB").start();
System.out.println(Thread.currentThread().getName() + " thread stop");
}
}
结果:main thread start
main thread stop
AAA thread start
0 AAA
BBB thread start
0 BBB
1 AAA
1 BBB
2 AAA
2 BBB
3 AAA
3 BBB
4 AAA
4 BBB
AAA thread stop
BBB thread stop
分析:个人觉得结果应该是乱序,测试了好几遍都是这个结果,应该每次测试结果是随机的,貌似还是很有序啊,晕,可能不同的电脑会出现不同的结果(没试过),不过从第一次0 AAA下面BBB线程才启动,可以看做是乱序的,这个程序首先执行main主线程,然后执行另外两个线程
b)实现runnable接口
public class TestRunnable implements Runnable{
public static void main(String[] args){
TestRunnable tr = new TestRunnable();
Thread t1 = new Thread(tr);
Thread t2 = new Thread(tr);
Thread t3 = new Thread(tr);
t1.start();
t2.start();
t3.start();
}
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(i+" "+Thread.currentThread().getName());
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果:0 Thread-0
0 Thread-1
0 Thread-2
1 Thread-0
1 Thread-1
1 Thread-2
2 Thread-0
2 Thread-1
2 Thread-2
3 Thread-0
3 Thread-1
3 Thread-2
4 Thread-0
4 Thread-1
4 Thread-2
分析:我觉得结果应该是乱序,这个结果挺有序的。我想了一下,在原博客中有这样一句:操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。这句话说明操作系统分配给线程的时间不一定均分而程序中有sleep,所以必然会出现无序的线程运行,可能是我的循环次数不够大,我把次数调成1000,果然出现了无序的情况。其实在500左右的时候就出现了无序,当然不是确定的500次,可能是300(也是不确定的)多次以上的任意一次。
852 Thread-2
853 Thread-1
848 Thread-0
853 Thread-2
854 Thread-1
849 Thread-0