本篇文章给大家分享的是有关里Java如何实现同步互斥通讯,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
本文主要从三个方面了解和掌握多线程:
1。多线程的实现方式,通过继承线程类和通过实现运行的接口的方式以及异同点。
2。多线程的同步与互斥中同步的使用方法。
3。多线程的通讯中的通知(),notifyAll(),及等()的使用方法,以及简单的生成者和消费者的代码实现。
通过继承Threa类来实现多线程主要分为以下三步:
第一步:继承线程,实现线程类中()的运行方法。
第二步:定义一个线程子类的实例。
第三步:通过调用线程类的开始()方法来启动线程。
<强>下面是简单的代码实现:强>
类myThread扩展线程{ int n=100; 公共空间run () { 而(真){ 如果(n比;0) { System.out.println (“:“Thread.currentThread () . getname () +“…“+ n)); 其他}{ 打破; } } } } 公开课ThreadTest { 公共静态void main (String [] args) { myThread myThread=new myThread (); mythread.setName(“子线程“); mythread.start (); } }
上面线程中用到的几个方法:Thread.currentThraed () . getname()方法得到当前线程的名字.mythread.setName(“子线程”);为mythread线程重命名为“子线程”。
第一步:实现运行的接口中运行的()方法。生成一个可运行的实例。
第二步:定义一个线程类,并且将上面的Runnable实例传给线程类的构造方法。
第三步:通过调用线程类的开始()方法来启动线程。
<强>下面是简单的代码实现:强>
类myRunnable实现Runnable { int n=100; 公共空间run () { 而(真){ 如果(n比;0) { System.out.println (“:“Thread.currentThread () . getname () +“…“+ n)); 其他}{ 打破; } } } } 公开课ThreadTest { 公共静态void main (String [] args) { myRunnable myRunnable=new myRunnable (); 线程mythread=新线程(myrunnable); mythread.setName(“子线程“); mythread.start (); } }
既然通过继承线程类,和实现运行的方法都能实现多线程的运行那么两种方式到底有什么不同呢?下面通过一个买票的类子来看看到底二者有什么不同:
假设售票处总共有100张票,通过三个窗口来进行售票也就是说我们要开辟三个不同的线程来实现买的票:首先看看通过线程类来实现买票的方式:
类myThread扩展线程{ int n=100; 公共空间run () { 而(真){ 如果(n比;0) { System.out.println (“:“Thread.currentThread () . getname () +“…“+ n)); 其他}{ 打破; } } } } 公开课ThreadTest { 公共静态void main (String [] args) { myThread m1=new myThread (); myThread m2=new myThread (); myThread m3=new myThread (); m1.setName(“窗口1“); m2.setName(“窗口2“); m3.setName(“窗口3“); m1.start (); m2.start (); m3.start (); } }
结果太长了我不展示了,可以看到原本三个窗口共同买100张票的,但是结果每个窗口都买了100张票,这个很好理解因为每个窗口都是一个独立的对象,都有自己的n=100,所以通过线程类来实现买票功能是不可行的,其实用线程方法来实现多线程,其中每个线程执行的代码并不是同一段代码。
<强>下面来看看实现运行的接口是怎样实现买票功能的:强>
类myRunnable实现Runnable { int n=100; 公共空间run () { 而(真){ 如果(n比;0) { System.out.println (“:“Thread.currentThread () . getname () +“…“+ n)); 其他}{ 打破; } } } } 公开课ThreadTest { 公共静态void main (String [] args) { myRunnable myRunnable=new myRunnable (); 线程m1=新线程(myrunnable); 线程m2=新线程(myrunnable); 线程m3=新线程(myrunnable); m1.setName(“窗口1“); m2.setName(“窗口2“); m3.setName(“窗口3“); m1.start (); m2.start (); m3.start (); } }
可以看出上面三个线程公用的是同一个可运行的子类,所以只是开辟三条线程来执行同一段可运行的代码,所以不会出现买300张票的情况。但是这个程序还是有问题的当讲到了后面的线程的同步与互斥后我们再来完善这段程序。