1、问下大家在多线程编程中,最经典的例子除了生产者消费者模型,哲学家就餐模型外,还有那些有研究价值的和死锁同步相关的问题?
2、避免死锁应该注意哪些问题?
------解决方案--------------------
研究多线程,当然得看下多人聊天的实现咯。
至于死锁的避免,操作系统里讲的是运用银行家算法。但是具体情况还得具体分析,以聊天为例,为加快连接速度一般要用到连接池,而且对于连接的时间也有限制,诸如如何处理连接超时,网络繁忙,以及优先响应等等。个人看法,抛砖引玉。
------解决方案--------------------
1
生活中很多实际行为都可以抽象为模型。
2
不是三言两语能说清楚。特别提醒的一个地方,就是注意线程异常时造成的死锁。
------解决方案--------------------
有时间可以看看<<Java Concurrency In Practise>>,书里有你想知道的关于并发基本全部
------解决方案--------------------
多线程 如果想理解原理的话,最好还是去看windows 核心编程和操作系统,系统结构,可能会更好点
------解决方案--------------------
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
最终的程序代码如下:
- Java code
public class ThreadTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new ThreadTest().init(); } public void init() { final Business business = new Business(); new Thread( new Runnable() { public void run() { for(int i=0;i<50;i++) { business.SubThread(i); } } } ).start(); for(int i=0;i<50;i++) { business.MainThread(i); } } private class Business { boolean bShouldSub = true;//这里相当于定义了控制该谁执行的一个信号灯 public synchronized void MainThread(int i) { if(bShouldSub) try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int j=0;j<5;j++) { System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j); } bShouldSub = true; this.notify(); } public synchronized void SubThread(int i) { if(!bShouldSub) try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int j=0;j<10;j++) { System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j); } bShouldSub = false; this.notify(); } }}备注:不可能一上来就写出上面的完整代码,最初写出来的代码如下,问题在于两个线程的代码要参照同一个变量,即这两个线程的代码要共享数据,所以,把这两个线程的执行代码搬到同一个类中去:package com.huawei.interview.lym;public class ThreadTest { private static boolean bShouldMain = false; public static void main(String[] args) { // TODO Auto-generated method stub /*new Thread(){ public void run() { for(int i=0;i<50;i++) { for(int j=0;j<10;j++) { System.out.println("i=" + i + ",j=" + j); } } } }.start();*/ //final String str = new String(""); new Thread( new Runnable() { public void run() { for(int i=0;i<50;i++) { synchronized (ThreadTest.class) { if(bShouldMain) { try { ThreadTest.class.wait();} catch (InterruptedException e) { e.printStackTrace(); } } for(int j=0;j<10;j++) { System.out.println( Thread.currentThread().getName() + "i=" + i + ",j=" + j); } bShouldMain = true; ThreadTest.class.notify(); } } } } ).start(); for(int i=0;i<50;i++) { synchronized (ThreadTest.class) { if(!bShouldMain) { try { ThreadTest.class.wait();} catch (InterruptedException e) { e.printStackTrace(); } } for(int j=0;j<5;j++) { System.out.println( Thread.currentThread().getName() + "i=" + i + ",j=" + j); } bShouldMain = false; ThreadTest.class.notify(); } } }}下面使用jdk5中的并发库来实现的:import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;public class ThreadTest{ private static Lock lock = new ReentrantLock(); private static Condition subThreadCondition = lock.newCondition(); private static boolean bBhouldSubThread = false; public static void main(String [] args) { ExecutorService threadPool = Executors.newFixedThreadPool(3); threadPool.execute(new Runnable(){ public void run() { for(int i=0;i<50;i++) { lock.lock(); try { if(!bBhouldSubThread) subThreadCondition.await(); for(int j=0;j<10;j++) { System.out.println(Thread.currentThread().getName() + ",j=" + j); } bBhouldSubThread = false; subThreadCondition.signal(); }catch(Exception e) { } finally { lock.unlock(); } } } }); threadPool.shutdown(); for(int i=0;i<50;i++) { lock.lock(); try { if(bBhouldSubThread) subThreadCondition.await(); for(int j=0;j<10;j++) { System.out.println(Thread.currentThread().getName() + ",j=" + j); } bBhouldSubThread = true; subThreadCondition.signal(); }catch(Exception e) { } finally { lock.unlock(); } } }}