本帖最后由 iloveyou 于 2014-4-30 00:58 编辑
- <p>这位同学,你好。愿意跟你交流一下,首先如果我没有看错的话,这部分的代码应该是毕老师多线程中“生产者与消费者小例子”一样效果的。</p><p>首先这部分代码的功能应该是:</p><p>(1)创建了四个线程对start类中的x元素进行+1和打印的效果。两个线程一块+1,两个线程一块打印。</p><p>(2)con1,con2并不是指的线程,给你纠正一下。</p><p>(3)你的代码运行结果出现了混乱,截图如下,我给你修改了一下。见下面,效果截图如下。</p><p>(4)Lock:替代了Synchronized : lock (),unlock() ,newCondition()
- Condition:替代了Object wait notify notifyAll await();signal();signalAll();
- 我们可以这样理解:首先 .当程序跑起来后程序中建立了四个线程。比如是线程1,线程2,线程3,线程4,前两个线程要执行+1的功能实现,后两个线程要执行打印x功能的实现。同时,你给+1功能和打印x功能各上了锁,就是你用的lock。在各自的lock中为两个lock分别绑定了两个condition,它们是con1,con2。这样子就可以保证线程1,线程2进入第一个lock后,也就是你的KAISHI功能模块中后它们共同拥有了con1,线程3和线程4进入第二个锁之后,也就是你的JIESHU功能模块中,给它们两个分配了con2.这么做的目的主要就是Condition的功能所要实现的意义,它可以保证实现不同功能的多个线程分组。在await()和signal()时更明确,而不至于引起混乱。这是我的理解。下面我把运行截图给你发上。
- import java.util.concurrent.locks.*;
- class Start
- { String x_name;
- boolean flag=true;
- int x=1;
- Lock lo=new ReentrantLock();
- Condition con1=lo.newCondition();//con1是指哪些线程? 如何区分?
- Condition con2=lo.newCondition();//con2是指哪些线程? 如何区分?
- public void kaishi(String name)
- {
- while(true)
- {
- lo.lock();
- while(!flag)
- {
- try {con1.await();} catch (InterruptedException e) {e.printStackTrace();}
- }
- this.x_name=name+"--"+x++;
- System.out.println("开始 " +this.x_name);
- flag=false;
- con2.signal();
- lo.unlock();
- }
- }
- public void jieshu()
- {
- while (true)
- {
-
- lo.lock();
- while(flag)
- {
- try {con2.await();} catch (InterruptedException e) {e.printStackTrace();}
- }
- System.out.println("结束----" +this.x_name);
- flag=true;
- con1.signal();
- lo.unlock();
- }
-
- }
- }
- class A implements Runnable
- {
- Start huan;
- A(Start a)
- {
- this.huan=a;
- }
- public void run()
- {
- huan.kaishi("X 的值是");
- }
- }
- class B implements Runnable
- {
- Start huan;
- B(Start a)
- {
- this.huan=a;
- }
- public void run()
- {
- huan.jieshu();
- }
- }
- class Demo2
- {
- public static void main(String args[])
- {
- Start s=new Start();
- new Thread(new A(s)).start();
- new Thread(new A(s)).start();
- new Thread(new B(s)).start();
- new Thread(new B(s)).start();
- }
- }
- </p></p></p>
复制代码 |
|