java多线程(Java多线程实现)

java多线程

Java多线程小结是什么?

  • 完整问题:Java多线程小结是什么?
  • 好评回答:最近在写一个利用Java多线程的操作系统的课程设计,所以自然就开始认真学习了一下java有关多线程的一段知识,发现java对多线程的支持非常的好,一个锁机制可以解决大部分的问题。我的第一个小实验性的东西是两个buffer,3中角色——producer,consumer,mover。其中我感觉producer和 mover是最好实现的,只要在buffer的定义中定义了相关的put,get同步操作即可,关键是mover。通过分析可以知道,mover必须同时持有两个两个buffer的锁才能进行move的操作,开始的是就想到了这里。做了一个简单的示例,发现不对,总是会假死。事后才知道这是发生了死锁。开始的时候百思不得其解。于是去吃晚饭,过了一会儿,突然有了想法——两个mover实例并发导致了死锁。发生死锁的原因:mover1取得了buf1,buf2的锁,然后发现buf2满,于是释放buf2的锁,notify了 consumer,consumer于是开始cost,cost之后,notify,结果把锁给了另一个Mover,于是就这样了——mover1有 buf1的锁,想要buf2,mover2有buf2的锁,想要buf1。死锁形成。我给出的解决方法比较粗糙,就是在mover类中设置一个静态的 Object作为mover所有实例的锁,mover首先要取得该锁,然后才可以取得buf1,buf2的锁,简单说就是叫mover串行。结果很成功。第二个实验:多个factory,多个store,都是buffer,然后还是3类——producer,mover,consumer。这回的难点是选择策略——由于每次producer不一定非要在同样的buffer间搬运,因此就存在每次running时候的选择问题,如何选更加智能,尤其对于Mover,如何选择才能使之比较高效而且没有死锁。经过考虑和实验,我的解决方法是利用Java自带的随机函数,new Random()。nextInt(bufs。size())来随机选择这里有Java API相关的解释:nextIntpublic int nextInt(int n)返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:public int nextInt(int n) {if (n> 31);?int bits, val;do {bits = next(31);val = bits % n;} while(bits – val + (n-1)

    Java多线程例子是什么?

  • 完整问题:Java多线程例子是什么?
  • 好评回答:Java排序算法代码Java调用javascriptjava内省机制写出一组模拟生产者/消费者的协作程序其中包括一个WoTou。java,代表消息一个MsgQueue。java,为一个队列,提供put(Message msg)方法和get()方法一个Produer。java,为生产者线程,在其run方法中每隔1秒产生一个Message对像并放入MsgQueue队列一个Consumer。java为消费者线程,在其run方法中不断从MsgQueue队列中获取Message对像,并显示在屏幕上一个TestMain。java,在其main方法中,启动2个Produer线程和2个消费者线程。要求:对于MsgQueue。java,队列的长度为10,当消息超过10个时,put()方法需要阻塞:当消息队列为空时,get()方法需要阻塞。public class ProducerConsumer {public static void main(String[] args) {SyncStack ss = new SyncStack();Producer p1= new Producer(ss,”p1″);Consumer c1= new Consumer(ss,”c1″);Producer p2= new Producer(ss,”p2″);Consumer c2= new Consumer(ss,”c2″);}}class WoTou {int id;WoTou(int id) {this。id = id;}public String toString() {return “WoTou : ” + id;}}class SyncStack {int index = 0;WoTou[] arrWT = new WoTou[6];public void push(WoTou wt) {while(index == arrWT。length) {try {this。wait();} catch (InterruptedException e) {e。printStackTrace();}}this。notifyAll();arrWT[index] = wt;index ++;}public WoTou pop() {while(index == 0) {try {this。wait();} catch (InterruptedException e) {e。printStackTrace();}}this。notifyAll();index–;return arrWT[index];}}class Producer implements Runnable {SyncStack ss = null;String a;Producer(SyncStack ss,String a) {this。ss = ss;this。a= a;Thread t=new Thread(this,a);t。start();}public void run() {for(int i=0; i

    java关于多线程的操作是怎样的?

  • 完整问题:java关于多线程的操作是怎样的?
  • 好评回答:一般服务器端代码,每次收到一个线程,一个client就会产生:/************************ 开始监听 **************************/int port = 4311;ServerSocket server = null;//服务器Socket client = null;//客户端try {server = new ServerSocket(port);} catch (IndirectionException e1) {System。out。println(“正在监听。。。”);}while(true){System。out。println(“等待客户”+i);i++;try {client = server。accept();//开始监听线程,接收到clientSystem。out。println(“客户地址:” + client。getInetAddress());} catch (IOException e1) {System。out。println(“正在等待客户”);}}客户端代码,启动之后便会连接服务器,得到回应之后便会形成socket连接Socket clientsocket = null;try {clientsocket = new Socket(“localhost”,4311);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke。printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke。printStackTrace();}。
  • Java的多线程是什么?

  • 完整问题:Java的多线程是什么?
  • 好评回答:一. 实现多线程1。 虚假的多线程例1:publicclassTestThread { inti=0, j=0; publicvoidgo(intflag){ while(true){ try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100); } catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } if(flag==0) i++; java/lang/System。java。html” target=”_blank”>System。out。println(“i=” + i); } else{ j++; java/lang/System。java。html” target=”_blank”>System。out。println(“j=” + j); } } } publicstaticvoidmain(java/lang/String。java。html” target=”_blank”>String[] args){ newTestThread()。go(0); newTestThread()。go(1); } } 上面程序的运行结果为:i=1i=2i=3。。。结果将一直打印出I的值。我们的意图是当在while循环中调用sleep()时,另一个线程就将起动,打印出j的值,但结果却并不是这样。关于sleep()为什么不会出现我们预想的结果,在下面将讲到。2。 实现多线程通过继承class Thread或实现Runnable接口,我们可以实现多线程2。1 通过继承class Thread实现多线程class Thread中有两个最重要的函数run()和start()。1) run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。2) 虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数。例2:publicclassTestThread extendsjava/lang/Thread。java。html” target=”_blank”>Thread{ privatestaticintthreadCount = 0; privateintthreadNum = ++threadCount; privateinti = 5; publicvoidrun(){ while(true){ try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100);} catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } java/lang/System。java。html” target=”_blank”>System。out。println(“Thread ” + threadNum + ” = ” + i); if(–i==0) return; } } >publicstaticvoidmain(java/lang/String。java。html” target=”_blank”>String[] args){ for(inti=0; i运行结果为:Thread 1 = 5Thread 2 = 5Thread 3 = 5Thread 4 = 5Thread 5 = 5Thread 1 = 4Thread 2 = 4Thread 3 = 4Thread 4 = 4Thread 1 = 3Thread 2 = 3Thread 5 = 4Thread 3 = 3Thread 4 = 3Thread 1 = 2Thread 2 = 2Thread 5 = 3Thread 3 = 2Thread 4 = 2Thread 1 = 1Thread 2 = 1Thread 5 = 2Thread 3 = 1Thread 4 = 1Thread 5 = 1从结果可见,例2能实现多线程的并行处理。**:在上面的例子中,我们只用new产生Thread对象,并没有用reference来记录所产生的Thread对象。根据垃圾回收机制,当一个对象没有被reference引用时,它将被回收。但是垃圾回收机制对Thread对象“不成立”。因为每一个Thread都会进行注册动作,所以即使我们在产生Thread对象时没有指定一个reference指向这个对象,实际上也会在某个地方有个指向该对象的reference,所以垃圾回收器无法回收它们。3) 通过Thread的子类产生的线程对象是不同对象的线程classTestSynchronized extendsjava/lang/Thread。java。html” target=”_blank”>Thread{ publicTestSynchronized(java/lang/String。java。html” target=”_blank”>Stringname){ super(name); } publicsynchronizedstaticvoidprt(){ for(inti=10; iSystem。out。println(java/lang/Thread。java。html” target=”_blank”>Thread。currentThread()。getName() + ” : ” + i); try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100); } catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } } } publicsynchronizedvoidrun(){ for(inti=0; iSystem。out。println(java/lang/Thread。java。html” target=”_blank”>Thread。currentThread()。getName() + ” : ” + i); try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100); } catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } } } } publicclassTestThread{ publicstaticvoidmain(java/lang/String。java。html” target=”_blank”>String[] args){ TestSynchronized t1 = newTestSynchronized(“t1”); TestSynchronized t2 = newTestSynchronized(“t2″); t1。start(); t1。start(); //(1)//t2。start(); (2)} } 运行结果为:t1 : 0t1 : 1t1 : 2t1 : 0t1 : 1t1 : 2由于是同一个对象启动的不同线程,所以run()函数实现了synchronized。如果去掉(2)的注释,把代码(1)注释掉,结果将变为:t1 : 0t2 : 0t1 : 1t2 : 1t1 : 2t2 : 2由于t1和t2是两个对象,所以它们所启动的线程可同时访问run()函数。2。2 通过实现Runnable接口实现多线程如果有一个类,它已继承了某个类,又想实现多线程,那就可以通过实现Runnable接口来实现。1) Runnable接口只有一个run()函数。2) 把一个实现了Runnable接口的对象作为参数产生一个Thread对象,再调用Thread对象的start()函数就可执行并行操作。如果在产生一个Thread对象时以一个Runnable接口的实现类的对象作为参数,那么在调用start()函数时,start()会调用Runnable接口的实现类中的run()函数。例3。1:publicclassTestThread implementsjava/lang/Runnable。java。html” target=”_blank”>Runnable{ privatestaticintthreadCount = 0; privateintthreadNum = ++threadCount; privateinti = 5; publicvoidrun(){ while(true){ try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100); } catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } java/lang/System。java。html” target=”_blank”>System。out。println(“Thread ” + threadNum + ” = ” + i); if(–i==0) return; } } publicstaticvoidmain(java/lang/String。java。html” target=”_blank”>String[] args){ for(inti=0; iThread(newTestThread())。start(); //(1)} } 运行结果为:Thread 1 = 5Thread 2 = 5Thread 3 = 5Thread 4 = 5Thread 5 = 5Thread 1 = 4Thread 2 = 4Thread 3 = 4Thread 4 = 4Thread 4 = 3Thread 5 = 4Thread 1 = 3Thread 2 = 3Thread 3 = 3Thread 4 = 2Thread 5 = 3Thread 1 = 2Thread 2 = 2Thread 3 = 2Thread 4 = 1Thread 5 = 2Thread 1 = 1Thread 2 = 1Thread 3 = 1Thread 5 = 1例3是对例2的修改,它通过实现Runnable接口来实现并行处理。代码(1)处可见,要调用TestThread中的并行操作部分,要把一个TestThread对象作为参数来产生Thread对象,再调用Thread对象的start()函数。3) 同一个实现了Runnable接口的对象作为参数产生的所有Thread对象是同一对象下的线程。例3。2:packagemypackage1; publicclassTestThread implementsjava/lang/Runnable。java。html” target=”_blank”>Runnable{ publicsynchronizedvoidrun(){ for(inti=0; iSystem。out。println(java/lang/Thread。java。html” target=”_blank”>Thread。currentThread()。getName() + ” : ” + i); try{ java/lang/Thread。java。html” target=”_blank”>Thread。sleep(100); } catch(java/lang/InterruptedException。java。html” target=”_blank”>InterruptedExceptione){ java/lang/System。java。html” target=”_blank”>System。out。println(“Interrupted”); } } } publicstaticvoidmain(java/lang/String。java。html” target=”_blank”>String[] args){ TestThread testThread = newTestThread(); for(inti=0; iThread(newTestThread(), “t” + i)。start(); (2) } } 运行结果为:t0 : 0t1 : 0t2 : 0t3 : 0t4 : 0t0 : 1t1 : 1t2 : 1t3 : 1t4 : 1t0 : 2t1 : 2t2 : 2t3 : 2t4 : 2t0 : 3t1 : 3t2 : 3t3 : 3t4 : 3t0 : 4t1 : 4t2 : 4t3 : 4t4 : 4由于代码(2)每次都是用一个新的TestThread对象来产生Thread对象的,所以产生出来的Thread对象是不同对象的线程,所以所有Thread对象都可同时访问run()函数。如果注释掉代码(2),并去掉代码(1)的注释,结果为:t0 : 0t0 : 1t0 : 2t0 : 3t0 : 4t1 : 0t1 : 1t1 : 2t1 : 3t1 : 4t2 : 0t2 : 1t2 : 2t2 : 3t2 : 4t3 : 0t3 : 1t3 : 2t3 : 3t3 : 4t4 : 0t4 : 1t4 : 2t4 : 3t4 : 4由于代码(1)中每次都是用同一个TestThread对象来产生Thread对象的,所以产生出来的Thread对象是同一个对象的线程,所以实现run()函数的同步。
  • 版权声明