java 用多线程模拟龟兔赛跑:

publicClassortoiseandharerace {publicStaticVoidMain(string [] grunes){runnablevs = newrace(); thredhare = newthread(vs,“ hare”); threadoroise = newthread(vs,“ totoise”); system.out.println(“准备好!go!”); hare.start(); tortoise.start();}} classrace instrumentRunnable {privacySticInterInts = 1 000; @OverridePublicVoidRun(){if(thread。
curressthread()。
getName()。
是等于(“兔”)){intshare = 0;而(divide

java多线程的好处

1 完全使用CPU资源。
现在,世界上大多数计算机都只有一个CPU。
因此,完全使用CPU资源特别重要。
执行单个圆角程序时,由于程序阻止,CPU可能会失业。
这将导致许多计算资源。
当线程睡觉或阻塞时,在程序中使用多线程可以执行其他主题,并且CPU恰好是空的。
这使得CPU很难有空闲时间。
因此,完全使用了CPU来源。
2 简化编程模型。
如果程序仅补充一个任务,只需输入单个线程程序,然后根据执行步骤输入代码。
但是要完成多个任务,如果您仍然使用单个线程,则必须确定是否以及何时必须在程序中执行每个任务。
例如,显示一个小时,小时,分钟和第二个指标。
使用一个线程,您必须在循环中判断这三个指标的旋转时间和这三个指示灯的角度。
如果使用三个链来处理这三个指标的外观,则对于每个线程,它就提到了一个特殊的任务。
这有助于开发人员了解和维护程序。
3 简化异步事件的处理。
当您获得不同的客户端链接时,处理服务器应用程序的最简单方法是为每个客户端连接创建线程。
聆听线程仍然负责聆听客户请求。
如果这种类型的应用程序使用单个线程对其进行处理,则当听力线程收到客户请求时,它开始读取客户端发送的数据。
阅读数据后,读取方法处于堵塞状态,即,该线程将不再能够听到客户端的请求。
为了在单个线程中处理多个客户端的需求,应使用非烧结巢连接和I/O异步。
但是,与使用I/O同步相比,使用I/O异步更难控制,并且更容易出现错误。
因此,使用多线程和I/O同步可以更容易地处理类似于许多需求的异步事件。
4 使GUI更有效。
当使用单个线程处理GUI事件时,应使用循环扫描可能随时发生的GUI事件。
除了扫描GUI事件外,还必须执行其他程序代码。
如果这些代码太长,GUI事件将“提高”直到执行代码。
在Swing,AWT和SWT等现代GUI框架中,用于发送事件的特殊线程(EDT)用于扫描GUI事件。
按下按钮时,按钮点击事件功能将被调用到此调度线程。
由于EDT任务仅是为了扫描GUI事件,因此这种响应事件的方式非常快。
5 节省成本并提高程序执行的效率,总体上有三种方法:(1 )增加计算机上的CPU数量。
(2 )启动程序的多个进程(3 )在程序中使用多个进程。
第一种方法更容易制作,但更昂贵。
此方法不需要程序修改,从理论上讲,任何程序都可以使用此方法来提高执行效率。
尽管第二种方法不需要购买新设备,但此方法不容易共享数据。
如果该程序要完成的任务必须共享数据,此方法不是很合适,并且多个主题的开始将消耗系统的许多来源。
第三种方法仅构成了第一种方法的缺陷,并继承了它们的优势。
也就是说,您不需要购买CPU,也不需要通过启用大量纱线来获得许多系统资源(如默认,线程所占据的内存空间比过程所占据的内存空间要小得多),并且乘以模拟许多CPU的操作。
因此,使用多线程是提高程序执行效率的最便宜方法。

java线程安全问题之静态变量、实例变量、局部变量

在Java多线程编程中,线程安全问题尤为重要。
SO称为螺纹保护意味着,当许多线程并行执行时,程序可以保持稳定性和纯度。
静态变量的显示,示例变量和局部变量在多线程环境中有所不同。
这三个变量的线程安全问题将在下面讨论。
稳定变量通常存储在方法区域中,为所有对象共享相同的内存空间。
这意味着,一旦修改了静态变量,其他线程也可以看到这些修改,因此静态变量的使用可能会导致线程安全问题。
示例变量不同。
在Singleton模式下,如果系统仅具有一个对象实例,则将在不同线程之间共享实例变量的修改,从而导致线程不受保护。
但是,在非单个模式下,每个线程操作的实例变量属于独立对象,因此线程安全。
本地变量位于每个线程的堆栈框架中,每个线程包含独立的工作内存,因此局部变量的使用不会引起线程安全问题。
静态变量的线程安全问题可以通过模拟证明。
假设我们有一个稳定的变量“ static_i”,许多线程试图修改其值,最终我们会发现静态变量的修改出现在许多线程之间,从而导致不一致的后果。
实例变量的线程安全问题是对象安装的实例可以通过变量验证。
假设在Singleton模式下,许多线程尝试同时修改同一示例变量,结果表明示例变量修改会在不同的线程之间出现,从而导致线程安全问题。
本地变量线程安全问题不会出现,因为每个线程都有自己的独立堆栈框架(存储在局部变量工作内存中),并且这些变量将不会在不同的线程之间共享。
静态方法的螺纹安全性取决于是否内部使用稳定变量。
如果不使用静态变量,则稳定方法将是线程安全的。
这是因为每个呼叫的稳定方法中声明的变量是免费的,并且不共享同一存储单元。
但是,如果用静态方法使用静态变量,它会引入线程安全问题,因为所有线程都共享稳定的变量,并且可能导致数据不一致。
总而言之,为了确保Java多线程程序的纯度和稳定性,有必要深入了解局部变量的静态变量,示例变量和本地变量,并基于IT采取适当的措施,例如使用线程安全数据结构,同步控制和其他技术手段。

课程设计题目,多线程编程:医院门诊模拟,想用java实现,求大神指点

典型的制造商 - 消费者模型。
了解J5 竞争库,同时库具有适当的组件实现。
如果您不明白,则:创建一个需要纱线安全性的队列,如果队列为空,则消费者块。
如果转弯达到一定的最大值,则制造商将被阻止。
使用通常的列表或已实现的队列将等级打包为安全线程。
同步原始方法或代码块。
编写一个或n个主题,模拟患者,排名以处理业务并在上线中添加数据。
达到最大音量后,等待,等待制造商的线程接收数据。
阻塞:makerlock.wait(); //虚拟机将线程发送到挂起,这实际上是操作系统,该螺纹可在CPU上保存当前的纱线状态。
然后转移开始使用的CPU资源,并且繁忙的内存不会发布。
当我将数据放在队列中时,因为我不知道接收状态中是否有任何消费者,我会通知客户:customlock.notifyall(); //虚拟机将消费者纱线执行,这实际上是操作系统,并恢复存储在CPU上的消耗状态,然后指导。
然后,根据不同操作系统的线程分配的算法,将链被任意定向。
阅读数据后,有必要通知制造商,您可以继续。
该原理与上面的原理相同:makerlock.notifyall();在排队时,当没有读取数据时:clientllock.wait(); //原理与上述相同。
最后,请注意,制造商和消费者使用两个不同的设施。
使用blockage.wait()的方法如下:同步(封锁){.... while(condition == true){lock.wait();} .... object o object o = queen.pop();最终,Blocking.notifyall();}在链读数的排名中开始模拟治疗业务的窗口;在纱线中,纱线的编写是为了模拟患者的排名。
新线程库还具有与旧线程库相对应的方法,并且新线程库具有安全有效的时间。
上面没有问题,但是上面写的是理解新线程数据结构和实现的基础。
com.zhidao包;导入java.util.linkedlist;导入java.util.list;导入java.util.random;公共类TestThread2 {//缓冲上层长私人长bufsize边界; //缓冲私人列表<字符串> bu f;公共测试(){buffetize = 5 ; owl ling =新连接云<);无效的公共集(字符串S){//模拟制造商无法与客户/*尝试{thread.sleep(1 00);} catch(InterruptException e){}*/synchronized(this){/waite whit way whiel(buf.size(buf.size()= = bufsize)= = bufsize)制造商:“+thread.currenthread read reaction farreent recuttion farreenthect() “尝试{this.wait();} catch(中断异常e){}} buf.add(s); //通知客户尝试{thread.sleep(1 00);} catch(interruptException e)}字符串s = null s = null; synChronized; synchronized(synChronized(this){while(while(awl.size(owl.size = 0))客户:“+thread.currentRead()。
getId()+“ start。
”); try {this.wait();}捕获(最终testThread2 tt = new Test()中断;();(();void run(){while(!thread.currenthRead()。
is -eistrusput()){system.out.println(“ thread:”+thread.currenthread()+“ get get get get get get get get get get get forded ofered ofered ofered”+tt.take();}}});线程C2 = new Thread(new Runnable(){@ouverridePublic void run(){while(!thread.currenthRead()。