1、问下大家在多线程编程中,最经典的例子除了生产者消费者模型,哲学家就餐模型外,还有那些有研究价值的和死锁同步相关的问题?
2、避免死锁应该注意哪些问题?

解决方案 »

  1.   

    呵呵,感谢ing。小弟最近在研究多线程,遇到好多问题。谢谢大家的帮助。
      

  2.   

    恩,同意ls的看法,其实多线程最重要的还是抽象模型。但是模型也是有难有易。小弟一时之间很难抽象出一些经典的较复杂的模型出来,ls能否举个例子?
      

  3.   

    有时间可以看看<<Java Concurrency In Practise>>,书里有你想知道的关于并发基本全部
      

  4.   

    多线程 如果想理解原理的话,最好还是去看windows 核心编程和操作系统,系统结构,可能会更好点
      

  5.   

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 最终的程序代码如下: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();
    }
    }
    }
    }摘自Java面试宝典
      

  6.   


    多人聊天是好例子,我就是用它学的多线程 当然生产者消费者是基础。先看看java核心技术高级篇 对你有帮助。