Java多线程学习总结(二)

一、interrupt方法一种让线程退出的方式。

我们提供的服务有:成都网站设计、做网站、微信公众号开发、网站优化、网站认证、盐山ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的盐山网站制作公司

 
 
 
  1. import java.util.*;
  2. public class TestInterrupt{
  3.     public static void main(String[] args){
  4.         MyThread t = new MyThread();
  5.         t.start();
  6.         try{Thread.sleep(10000);}
  7.         catch(InterruptedException i){}
  8.         t.interrupt();
  9.     }
  10. }
  11. class MyThread extends Thread{
  12.     public void run(){
  13.         while(true){
  14.             try{
  15.                 System.out.println("------"+new Date()+"-----");
  16.                 Thread.sleep(1000);
  17.             }catch(InterruptedException i){
  18.                 return;
  19.             }
  20.         }
  21.     }
  22. }

二、join和yield方法
 t.join(); //t的run()方法完才会继续执行当前线程方法体
             //也就是两个线程变成了一个线程
 t.yield(); //暂停当前正在执行的线程对象,并执行其他线程。方法为静态
              //哪个线程体执行此方法,哪个线程让步

 
 
 
  1. public class TestYield {
  2.   public static void main(String[] args) {
  3.     MyThread3 t1 = new MyThread3("t1");
  4.     MyThread3 t2 = new MyThread3("t2");
  5.     t1.start(); t2.start();
  6.   }
  7. }
  8. class MyThread3 extends Thread {
  9.   MyThread3(String s){super(s);}
  10.   public void run(){
  11.     for(int i =1;i<=100;i++){
  12.       System.out.println(getName()+": "+i);
  13.       if(i%10==0){
  14.         yield();
  15.       }
  16.     }
  17.   }
  18. }

三、线程优先级别
 线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级为5.
 Thread.MAX_PRIORITY=1
 Thread.MIN_PRIORITY=10
 Thread.NORM_PRIORITY=5
 例:t.setPriority(Thread.NORM_PRIORITY+3);
 
四、线程同步
 1.同步代码块
 synchronized(this){  //在执行代码块过程中,不会被其他线程打断
  ... 
 }
 public sunchronized void method //执行此方法时,当前对象被锁定
 在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性,每个对象 都对应一个可称为"互斥锁"的标记,这个标记保证在任一时刻,只能有一个线程访 问该对象。
 2.线程死锁

 
 
 
  1. public class TestDeadLock implements Runnable {
  2.     public int flag = 1;
  3.     static Object o1 = new Object(), o2 = new Object();
  4.     public void run() {
  5. System.out.println("flag=" + flag);
  6.         if(flag == 1) {
  7.             synchronized(o1) {
  8.                 try {
  9.                     Thread.sleep(500);
  10.                 } catch (Exception e) {
  11.                     e.printStackTrace();
  12.                 }
  13.                 synchronized(o2) {
  14.                     System.out.println("1");    
  15.                 }
  16.             }
  17.         }
  18.         if(flag == 0) {
  19.             synchronized(o2) {
  20.                 try {
  21.                     Thread.sleep(500);
  22.                 } catch (Exception e) {
  23.                     e.printStackTrace();
  24.                 }
  25.                 synchronized(o1) {
  26.                     System.out.println("0");
  27.                 }
  28.             }
  29.         }
  30.     }    
  31.     
  32.     public static void main(String[] args) {
  33.         TestDeadLock td1 = new TestDeadLock();
  34.         TestDeadLock td2 = new TestDeadLock();
  35.         td1.flag = 1;
  36.         td2.flag = 0;
  37.         Thread t1 = new Thread(td1);
  38.         Thread t2 = new Thread(td2);
  39.         t1.start();
  40.         t2.start();
  41.         
  42.     }
  43. }

五、生产者消费者问题

 
 
 
  1. public class ProducerConsumer {
  2.     public static void main(String[] args) {
  3.         SyncStack ss = new SyncStack();
  4.         Producer p = new Producer(ss);
  5.         Consumer c = new Consumer(ss);
  6.         new Thread(p).start();
  7.         new Thread(p).start();
  8.         new Thread(p).start();
  9.         new Thread(c).start();
  10.     }
  11. }
  12. class WoTou {
  13.     int id; 
  14.     WoTou(int id) {
  15.         this.id = id;
  16.     }
  17.     public String toString() {
  18.         return "WoTou : " + id;
  19.     }
  20. }
  21. class SyncStack {        //栈实现
  22.     int index = 0;
  23.     WoTou[] arrWT = new WoTou[6];    //相当于装物品的篮子
  24.     
  25.     public synchronized void push(WoTou wt) {    //生产物品,线程安全
  26.         while(index == arrWT.length) {        //当篮子满了线程等待
  27.             try {            
  28.                 this.wait();        
  29.             } catch (InterruptedException e) {
  30.                 e.printStackTrace();
  31.             }
  32.             
  33.         }
  34.         this.notifyAll();    //开始生产时,叫醒等待的其他线程开始消费
  35.         arrWT[index] = wt;    
  36.         index ++;
  37.     }
  38.     
  39.     public synchronized WoTou pop() {        //消费物品,线程安全
  40.         while(index == 0) {            //如果篮子空了
  41.             try {
  42.                 this.wait();        //线程等待,等待生产者开始                         
  43. //生产,叫醒此线程
  44.             } catch (InterruptedException e) {
  45.                 e.printStackTrace();
  46.             }
  47.             
  48.         }
  49.         this.notifyAll();            //消费时喊醒生产者生产
  50.         index--;
  51.         return arrWT[index];
  52.     }
  53. }
  54. class Producer implements Runnable {            //生产者类
  55.     SyncStack ss = null;
  56.     Producer(SyncStack ss) {
  57.         this.ss = ss;
  58.     }
  59.     
  60.     public void run() {
  61.         for(int i=0; i<20; i++) {    //生产20个
  62.             WoTou wt = new WoTou(i);
  63.             ss.push(wt);            
  64.             System.out.println("生产了:" + wt);
  65.             try {
  66.                 Thread.sleep((int)(Math.random() * 200));
  67.             } catch (InterruptedException e) {
  68.                 e.printStackTrace();
  69.             }            
  70.         }
  71.     }
  72. }
  73. class Consumer implements Runnable {
  74.     SyncStack ss = null;
  75.     Consumer(SyncStack ss) {
  76.         this.ss = ss;
  77.     }
  78.     
  79.     public void run() {
  80.         for(int i=0; i<20; i++) {        //消费20个
  81.             WoTou wt = ss.pop();
  82.             System.out.println("消费了: " + wt);
  83.             try {
  84.                 Thread.sleep((int)(Math.random() * 1000));
  85.             } catch (InterruptedException e) {
  86.                 e.printStackTrace();
  87.             }            
  88.         }
  89.     }
  90. }

文章名称:Java多线程学习总结(二)
链接URL:http://www.csdahua.cn/qtweb/news45/220545.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网