浅谈Java多线程(一)

Java支持多线程,可以通过继续Thread类或实现Runnable接口定义线程类,并在该类中重写run方法。

一个简单的Java线程类MyThread如下所示。

在MyThread的run方法中,香港虚拟主机,每隔500ms(Thread.sleep(500);)输出一次信息。在主函数中,新建MyThread实例对象,并使用对象的start方法启动该线程实例。程序输出结果部分如下所示。

MyThread Processing –> 1

MyThread Processing –> 2

MyThread Processing –> 3……

多线程的同步

假设现在有两件工具,三个工人,每个工人工作时需要同时使用这两件工具。使用Java多线程模拟上述情景,使用线程类WorkThread表示工人,使用ToolBox表示两件工具所在的工具箱,如下所示。

主函数如下所示,其中ToolBox类实例toolBox表示工人共用的工具箱,通过WorkerThread类的构造函数构造三个工人线程类,并传入工人姓名和toolBox,启动线程。

执行结果部分如下所示。

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:Bob Tool2:Bob

*Wrong*: Tool1:Bob Tool2:Jack

*Wrong*: Tool1:Bob Tool2:Jack

*Wrong*: Tool1:Bob Tool2:Jack

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:JackTool2:Jack

*Wrong*: Tool1:JackTool2:Tom

*Wrong*: Tool1:JackTool2:Tom

*Wrong*: Tool1:JackTool2:Tom

*Right*: Tool1:Tom Tool2:Tom

可以看出,由于三个工人线程类共享使用工具箱中的工具,导致存在对于工具使用的竞争。由于ToolBox中useTool方法的代码(即工人使用工具)存在上述多线程之间的资源竞争,因此将其称为临界区(Critical Section)。临界区如下所示。

对于上述临界区中的代码,需要实现同步,即在一个线程中,要么都执行,要么都不执行。在Java中,可以使用关键字synchronized实现同步。synchronized的使用方法有两种:

1)对于需要同步的共享实例对象,将synchronized添加为方法的修饰符,网站空间,如下所示。

2)将需要同步的临界区代码放入synchronized(this){}中,如下所示。

使用synchronized同步后,重新执行原主函数,得到正确执行结果。

*Right*: Tool1:Tom Tool2:Tom

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:Tom Tool2:Tom

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:Tom Tool2:Tom

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:Tom Tool2:Tom

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:Tom Tool2:Tom

*Right*: Tool1:Bob Tool2:Bob

*Right*: Tool1:JackTool2:Jack

*Right*: Tool1:Tom Tool2:Tom

本文出自 “学习文档” 博客,请务必保留此出处

,香港服务器还深深埋在心底,要除去,怕是不能活命。

浅谈Java多线程(一)

相关文章:

你感兴趣的文章:

标签云: