当前位置: 代码迷 >> J2SE >> java 多线程模型解决办法
  详细解决方案

java 多线程模型解决办法

热度:257   发布时间:2016-04-24 18:10:05.0
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();                }                            }    }}
  相关解决方案