java1234开源博客系统
博客信息

Java多线程-线程同步

发布时间:『 2016-12-14 15:18』  博客类别:Java核心基础  阅读(6933) 评论(0)

Java多线程-线程同步


前面的实例已经设计到同步问题:


上代码:

package com.java1234.chap09.sec05;

public class Thread1 implements Runnable{

	private int baoZi=1;
	
	private String threadName;

	public Thread1(String threadName) {
		super();
		this.threadName = threadName;
	}

	@Override
	public void run() {
		while(baoZi<=10){
			System.out.println(threadName+" 吃第"+baoZi+"个包子");
			baoZi++;
		}
	}
	
	public static void main(String[] args) {
		Thread1 t1=new Thread1("超级张三线程");

		Thread t11=new Thread(t1);
		Thread t12=new Thread(t1);
		Thread t13=new Thread(t1);
		
		t11.start();
		t12.start();
		t13.start();
	}

}

运行输出:

超级张三线程 吃第1个包子

超级张三线程 吃第1个包子

超级张三线程 吃第2个包子

超级张三线程 吃第3个包子

超级张三线程 吃第4个包子

超级张三线程 吃第5个包子

超级张三线程 吃第6个包子

超级张三线程 吃第7个包子

超级张三线程 吃第8个包子

超级张三线程 吃第9个包子

超级张三线程 吃第11个包子

超级张三线程 吃第8个包子


我们发现 会有多个线程同时进入方法吃包子的情况发生,这时候,就引入了线程同步。可以给方法加同步,同一时刻,只允许一个线程进入方法;

关键字 synchronized

package com.java1234.chap09.sec05;

public class Thread3 implements Runnable{

	private int baoZi=1;
	
	private String threadName;

	public Thread3(String threadName) {
		super();
		this.threadName = threadName;
	}

	@Override
	public synchronized void run() {
		while(baoZi<=10){
			System.out.println(threadName+" 吃第"+baoZi+"个包子");
			baoZi++;
		}
	}
	
	public static void main(String[] args) {
		Thread3 t1=new Thread3("超级张三线程");

		Thread t11=new Thread(t1);
		Thread t12=new Thread(t1);
		Thread t13=new Thread(t1);
		
		t11.start();
		t12.start();
		t13.start();
	}

}

运行输出:

超级张三线程 吃第1个包子

超级张三线程 吃第2个包子

超级张三线程 吃第3个包子

超级张三线程 吃第4个包子

超级张三线程 吃第5个包子

超级张三线程 吃第6个包子

超级张三线程 吃第7个包子

超级张三线程 吃第8个包子

超级张三线程 吃第9个包子

超级张三线程 吃第10个包子


也可以用同步块:

package com.java1234.chap09.sec05;

public class Thread4 implements Runnable{

	private int baoZi=1;
	
	private String threadName;

	public Thread4(String threadName) {
		super();
		this.threadName = threadName;
	}

	@Override
	public void run() {
		/**
		 * 同步块
		 */
		synchronized (this) {
			while(baoZi<=10){
				System.out.println(threadName+" 吃第"+baoZi+"个包子");
				baoZi++;
			}
		}
	}
	
	public static void main(String[] args) {
		Thread4 t1=new Thread4("超级张三线程");

		Thread t11=new Thread(t1);
		Thread t12=new Thread(t1);
		Thread t13=new Thread(t1);
		
		t11.start();
		t12.start();
		t13.start();
	}

}

运行结果一样;



关键字:   线程同步  
关注Java1234微信公众号
博主信息
Java1234_小锋
(知识改变命运,技术改变世界)
Powered by Java1234 V3.0 Copyright © 2012-2016 Java知识分享网 版权所有