读书人

java 多线程事例

发布时间: 2012-11-01 11:11:31 作者: rapoo

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;}@Overridepublic 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();                     }              }       }}

读书人网 >编程

热点推荐