Java多线程总结

本文是本人阅读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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值