`

java 多线程例子

阅读更多
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…
由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。
线程同步有两种基本方法:
(1)    synchronized
(2)    wait,notify,notifyAll
现在分别采用这两种方法来解答这道题目。
package multithread;

class XunleiLock 

{

       public String name = "A";

       public String getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

}

public class XunleiInterviewMultithread {

	public static void main(String[] args) {

		XunleiLock lock = new XunleiLock();

		new Thread(new XunleiPrinter("A", lock)).start();

		new Thread(new XunleiPrinter("B", lock)).start();

		new Thread(new XunleiPrinter("C", lock)).start();

	}

}

class XunleiPrinter implements Runnable {

	private String name = "";

	private XunleiLock lock = null;

	private int count = 10;

	public XunleiPrinter(String name, XunleiLock lock) {

		this.name = name;

		this.lock = lock;

	}

	@Override
	public void run() {

		while (count > 0) {

			synchronized (lock) {

				if (lock.getName().equalsIgnoreCase(this.name)) {

					System.out.print(name);

					count--;

					if (this.name.equals("A")) {

						lock.setName("B");

					} else if (this.name.equals("B")) {

						lock.setName("C");

					} else if (this.name.equals("C")) {

						lock.setName("A");

					}

				}

			}

		}

	}

}


第二种方法:修改线程主体:
package multithread;

class XunleiPrinter2 implements Runnable {

       private String name = "";

       private XunleiLock lock = null;

       private int count=10;

       public XunleiPrinter2(String name, XunleiLock lock) {

              this.name = name;

              this.lock = lock;

       }

       @Override

       public void run() {

              while(count>0) {

                     synchronized (lock) {

                            while(!lock.getName().equalsIgnoreCase(this.name)) {

                                   try{

                                          lock.wait();

                                   }catch(InterruptedException e){

                                          e.printStackTrace();

                                   }

                            }

                            System.out.print(name);

                            count--;

                            if (this.name.equals("A")) {

                                   lock.setName("B");

                            } else if (this.name.equals("B")) {

                                   lock.setName("C");

                            } else if (this.name.equals("C")) {

                                   lock.setName("A");

                            }

                            lock.notifyAll();

                     }

              }

       }

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics