日期:2014-05-20  浏览次数:20757 次

java 多线程模型
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();
                }                    
        }
    }
}