Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7065874
  • 博文数量: 701
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12021
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院架构师,专注企业数字化各个方面,MES/ERP/CRM/OA、物联网、传感器、大数据、ML、AI、云计算openstack、Linux、SpringCloud。

文章分类

全部博文(701)

分类: Java

2013-11-27 11:40:10

Eclipse3.4.2 + JDK6.0.35
一、线程不安全

package atest.myThread;

/**
 * 产品属性及交互类
 * @author
 * @version $Revision$
 */
public class SellForm {

    int productNum;

    // customer
    public int getProductNum() {
        System.out.println("Customer:" + productNum);
        return productNum;
    }

    // produce
    public void setProductNum(int productNum) {
        this.productNum = productNum;
        System.out.println("Producer:" + productNum);
    }
}

package atest.myThread;

/**
 *
 * 動作行為類:生產者
 * @author
 * @version $Revision$
 */
public class Producer implements Runnable {

    SellForm sf;
    // 构造函数
    Producer(SellForm sf){
        this.sf = sf;
        new Thread(this, "Producer").start();
    }

    @Override
    public void run() {
        // TODO 自動生成されたメソッド?スタブ
        int i = 0;
        while(true){
            sf.setProductNum(i++);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }

    }

}

package atest.myThread;

/**
 *
 * 動作行為類:消費者
 * @author
 * @version $Revision$
 */
public class Customer implements Runnable {

    SellForm sf;
    public Customer(SellForm sf) {
        // TODO 自動生成されたコンストラクター?スタブ
        this.sf = sf;
        new Thread(this, "Customer").start();
    }

    @Override
    public void run() {
        // TODO 自動生成されたメソッド?スタブ
        while(true){
            sf.getProductNum();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
    }

}

package atest.myThread;

/**
 * 产品实行类
 * @author
 * @version $Revision$
 */
public class SellPCBlogic {

    /**
     * [メソッドの説明を書きましょう]
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド?スタブ
        SellForm sf = new SellForm();
        new Producer(sf);
        new Customer(sf);

        System.out.print("Ctrl+C to pause!");

    }

}

因为没有同步所以是线程不安全的,执行结果如下:
Producer:0
Ctrl+C to pause!Customer:0
Producer:1
Customer:1
Customer:1
Producer:2
Customer:2
Producer:3
Producer:4
Customer:4
Producer:5
Customer:5
Customer:5
Producer:6
没有如想象的交替进行,customer3缺,customer5多。

修正方式请参照java多线程编程(2)
http://blog.chinaunix.net/uid-7374279-id-4013353.html

阅读(1829) | 评论(0) | 转发(0) |
0

上一篇:关于JNI技术

下一篇:java多线程编程(2)

给主人留下些什么吧!~~