java中多线程理解总结

1.理解多线程

首先我们要了解什么是串行并发并行

串行:一个线程执行到底,相当于单线程。

并发:多个线程交替执行,抢占cpu的时间片,但是速度很快,在宏观角度看来就像是多个线程同时执行。

并行:多个线程在不同的cpu核心中同时执行。

 

并发与并行的区别:

并发严格的说不是同时执行多个线程,只是线程交替执行且速度很快,相当于同时执行。

而并行是同时执行多个线程,也就是多个cpu核心同时执行多个线程。

 

在实际开发中,我们不需要关心是否是并发还是并行,因为cpu会帮我们处理多线程,开发中可以认为多线程就是同时执行多个线程。

2.进一步理解java中的多线程

在java中,多个线程同时执行可能会造成线程安全问题(线程之间同时拥有一个变量,且发生了修改),为了避免这个问题,需要同步锁来使一个线程执行时,其他线程会等待这个线程执行完毕才执行,而不是”同时“执行。

 

public static void main(String[] args) throws Exception {  
	cachedThreadPool();
}
public static void cachedThreadPool() {
	ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
	for (int i = 0; i < 5; i++) {
            MyThread mt = new MyThread();
	    cachedThreadPool.execute(mt);//同时开启5个MyThread线程
	}
}
class MyThread extends Thread{
	@Override
	public void run() {
		TestThread.testMethod();
	}
}
class TestThread{
	private static Lock lock = new ReentrantLock();
	private static Condition c = lock.newCondition();
	static int i = 0;
	static TestThread mt = null;
    public static int testMethod() {
    	try {
    	lock.lock();//同步锁
    	System.out.println(Thread.currentThread().getName() + "进来了!");
    	signal();//唤醒线程
    	 while(i<100){
    		 if(i == 2){
    			 await();//当前线程等待
    			 Thread.sleep(1000);
    			 i+=5;
    		 }
    		 i++;
    		 System.out.println(i);
    		 System.out.println(Thread.currentThread().getName());
    		 if(i==28){
    			// signal();
    		 }
    	 }
        } catch (Exception e) {
	        e.printStackTrace();
	    } finally {
	    	lock.unlock();
		}
    	return i;
    }
    public static void await(){
    	try {
			System.out.println("线程等待:" + Thread.currentThread().getName());
			c.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    public static void signal(){
    	try
        {
            lock.lock();
            System.out.println("唤醒线程:" + Thread.currentThread().getName());
            c.signal();
        }
        finally
        {
            lock.unlock();
        }
    }
}

结果:

如果这个结果大家可以看懂,说明对于多线程已经理解的差不多了。

分析:

此时线程4依然还是等待状态,没有其他线程可以唤醒线程4

如果另i=28时,唤醒线程,则线程2会唤醒线程4,使线程4执行后续操作。

while(i<10){
    	if(i == 2){
    		await();
    		Thread.sleep(1000);
    		i+=5;
    	}
    	i++;
    	System.out.println(i);
    	System.out.println(Thread.currentThread().getName());
    	if(i==28){
    	    signal();//唤醒最后一个等待的线程
        }
}
 

结果:

 

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值