读书人

请问java线程有关问题

发布时间: 2012-01-13 22:43:30 作者: rapoo

请教java线程问题
我刚学习线程 感觉很懵 看不懂 也不清楚怎么用 望高手指点一二 不胜感激!!!!

[解决办法]
其实那些例子都是操作系统中进程的例子
哲学家就餐 生产着消费者 理发师 读者写者
但是如果你想了解同步和互斥的原理 是一样的

如果你真的想深入的话 就要把操作系统学好
[解决办法]
多线程我觉得这东西要在实践中使用这样效果才好,所以现在只需学习语法,了解常见的处理
并发的方式即可。
Java就在语言级支持多线程,所以使用起来忒方便,若具体和业务扯起来(它也应该用于业务嘛),
得“小心地”写,否则debug时你会很头大,尤其是那种恶心的“试了100次或更多而只出现一次”的那种……
Good luck。
[解决办法]
刚好前几天写了个生产者消费者问题,供楼主参考一下,有什么不懂的地方可以直接问我,也可以百度谷歌csdn一下

Java code
public class ProducerConsumer{    public static void main(String[] args)    {        Basket basket = new Basket(6);                Producer p1 = new Producer(basket);        Producer p2 = new Producer(basket);        Consumer c1 = new Consumer(basket);        Consumer c2 = new Consumer(basket);                Thread t1 = new Thread(p1, "生产者1");        Thread t2 = new Thread(p2, "生产者2");        Thread t3 = new Thread(c1, "消费者1");        Thread t4 = new Thread(c2, "消费者2");                t1.start();        t2.start();        t3.start();        t4.start();    }}class Bread{    int id ;    public Bread(int id)    {        this.id = id;    }}class Basket{    int size;//当前面包数目    int id;//当前面包id    Bread[] breads;//存放面包的数组        public Basket(int n)    {        breads = new Bread[n];    }}class Producer implements Runnable{    Basket basket;//装面包的篮子    boolean isGoOn = true;//是否继续生产        /**     * 构造方法,传递篮子     */    public Producer(Basket basket)    {        this.basket = basket;    }        /**     * 重写run方法,当篮子不满的时候继续生产,     * 满的时候wait     */    @Override    public void run()    {        while (isGoOn)        {            try            {                synchronized(basket)                 {                    Thread.sleep((int)(Math.random()*1000));                                        if (basket.size < basket.breads.length)//篮子不满                    {                        /*往当前篮子装面包,装完id和size分别加1*/                        System.out.print(Thread.currentThread().getName()                                + ": 生产的是" + basket.id  + "号面包,");                        basket.breads[basket.size++] = new Bread(basket.id++);                        System.out.println("现在共有" + basket.size + "个面包");                                                /*篮子装的是第一个包子时,唤醒消费者*/                        if (basket.size == 1)                        {                            System.out.println(Thread.currentThread().getName()                                    +" :有包子了,可以来吃了!");                            basket.notifyAll();                        }                    }                    /*篮子满了,等待*/                    if (basket.size == basket.breads.length)                    {                        System.out.println(Thread.currentThread().getName()                                    +" :篮子满了,请快点吃!");                        basket.wait();                    }                }            }catch (InterruptedException e)            {                e.printStackTrace();            }        }        }}class Consumer implements Runnable{    Basket basket;//装面包的篮子    boolean isGoOn = true;//是否继续消费        /**     * 构造方法,传递篮子     */    public Consumer(Basket basket)    {        this.basket = basket;    }        /**     * 重写run方法,当篮子有面包时的时候可以消费,     * 没有的时候wait     */    @Override    public void run()    {        while (isGoOn)        {            try            {                synchronized (basket)                {                    Thread.sleep((int)(Math.random()*1000));                                        if (basket.size > 0)//篮子不为空                    {                        /*往当前篮子拿面包,拿的是id-1号面包,拿完size减1*/                        System.out.print(Thread.currentThread().getName()                                + ":拿的是" + --basket.id + "号面包,");                        basket.size--;                        System.out.println("现在还剩" + basket.size + "个面包");                                                /*篮子拿的是最上面一个包子时,唤醒生产者*/                        if (basket.size == basket.breads.length - 1)                        {                            System.out.println(Thread.currentThread().getName()                                    + ": 篮子有空位,可以继续生产了!");                            basket.notifyAll();                        }                    }                    /*篮子为空,等待*/                    if (basket.size == 0)                    {                        System.out.println(Thread.currentThread().getName()                                    + " :篮子空了,请快点生产!");                        basket.wait();                        }                    }            }catch (InterruptedException e)            {                e.printStackTrace();            }        }        }} 


[解决办法]
写过三五年的代码后,应该就能领会 Java 中的多线程为什么是 Java 中三大基石之一了。

三大基石是我自己给 Java 中最为优秀三块的定义,Java 最初就是以这三块著称的:多线程、网络通信、安全控制
[解决办法]
首先弄清楚实现多线程,有两种方法!
一.继承Thread这个类,并重写他的run方法;
二.实现Runnable这个接口,并实现其run方法;
//如果你想问他们用哪个好,那我觉得你因该先弄明白具体类和接口的不同!
然后,你再弄清楚,多线程同步问题!
然后同步的使用的关键字"synchronized"的两种用法,一是锁方法,还有就是锁对象!
这样一步一步弄明白,你就大体OK了,你如果找不到不明白的问题,怎么学线程呢..
[解决办法]
多学几个例子吧。网上一大坨,,
多线程,时间片,主线程,孩子线程

开辟线程的两种方法

sleep()方法 ,

synchronized 同步的使用,有哪些方式

死锁

生产者消费者问题(while /if)

线程池等

每个知识点找个例子吧,,

读书人网 >J2SE开发

热点推荐