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