zoukankan      html  css  js  c++  java
  • 《day16_多线程细节_Eclipse使用》

     1  多线程的一些细节:
     2  1,面试题:sleep方法和wait方法异同点是什么?
     3         相同点:可以让线程处于冻结状态。
     4         不同点:
     5             1 6                 sleep必须指定时间。
     7                 wait可以指定时间,也可以不指定时间。
     8             2 9                 sleep是时间到,线程处于临时阻塞或者运行。
    10                 wait如果没有指定时间,必须要通过notify或者notifyAll唤醒。
    11             312                 sleep不一定非要定义在同步中,而wait必须要定义在同步中。
    13             414                 都定义在同步中,
    15                 线程执行到sleep不会释放锁,
    16                 线程执行到wait会释放锁。
    17 synchronized(obj)
    18 {
    19     //sleep(5000);
    20     wait();//0 1 2
    21     code...
    22 }
    23 
    24 synchronized(obj)
    25 {
    26     notifyAll();//3
    27     code...
    28 }
    29  2,线程如何停止呢?
    30         stop方法过时了,看描述发现,有其他解决方案。
    31         线程结束,就是让线程任务代码执行完,run方法结束。
    32         run方法咋结束呢?
    33         run方法中通常都定义循环。只要控制住循环就可以了。
    34 
    35         注意:万一线程在任务中处于冻结状态,那么它还能去判断标记吗?不能!
    36         咋办?通过查阅stop方法的描述,发现提供了一个解决方案。
    37         文档中的解决方案:
    38             如果目标线程等待很长时间(例如基于一个条件变量),
    39             则应使用 interrupt 方法来中断该等待。
    40             所谓的中断并不是停止线程。
    41             interrupt的功能是:将线程的冻结状态清除,让线程恢复到运行状态(让线程重新具备cpu的执行资格。)
    42             因为是强制性的所以会有异常发生,可以在catch中捕获异常。在异常处理中,改变标记,让循环结束。让run方法结束。
    43 3,守护线程,后台线程,一般创建的都是前台线程。
    44         前台后台线程运行时都是一样的,获取cpu的执行权执行。
    45         只有结束的时候有些不同。
    46         前台线程要通过run方法结束,线程结束。
    47         后台线程也可以通过run方法结束,线程结束,还有另一种情况。
    48         当进程中所有的前台线程都结束了,这时无论后台线程处于什么样的状态,都会结束,从而线程结束。
    49         进程结束依赖的都是前台线程。
    50 
    51 4.线程的优先级:用数字标识的。 1-18
    52     其中默认的初始优先级是5. 最明显的三个优先级 1 ,5 ,10.
    53     setPriority(Thread.MAX_PRIORITY);
    54 5,线程组:ThreadGroup.可以通过Thread的构造函数明确新线程对象所属的线程组。
    55     线程组的好处,可以对多个同组线程进行统一的操作。
    56     默认都属于main线程组。
    57 
    58 6,开发中线程的匿名内部类体现。
    59  
     1 //day16多线程细节&Eclipse的使用。(需求一:解决妖的问题。)
     2 
     3 /*
     4 需求:
     5 资源有姓名和性别。
     6 两个线程:
     7     一个负责给姓名和性别赋值。
     8     一个负责获取姓名和性别的值。
     9 
    10 参阅ThreadTest2.java文件。
    11 
    12 要求:1,运行一下,解决程序中“妖”的问题。
    13     分析过程:
    14     加入同步,必须保证同一个锁,解决妖的问题。
    15 
    16 要求2:实现正确数据的间隔输出 如:
    17 张飞--男
    18 rose--女女女
    19 张飞--男
    20 rose--女女女
    21 
    22 要求3:对代码进行重构。
    23     将name,sex私有化,资源类提供对其访问的方法。
    24 
    25 要求4:将程序改成JDK1.5的Lock Conditon接口。
    26 
    27 */
    28 
    29 //描述资源
    30 class Resource
    31 {
    32     String name;
    33     String sex;
    34 }
    35 //赋值线程任务
    36 class Input implements Runnable
    37 {
    38     private Resource r;
    39 //    private Object obj = new Object();
    40     Input(Resource r)//任务一初始化就必须要处理的资源。
    41     {
    42         this.r = r;
    43     }
    44     public void run()
    45     {
    46         int x = 0;
    47         while(true)
    48         {
    49             synchronized(r)
    50             {
    51                 if(x==0)
    52                 {
    53                     r.name = "张飞";
    54                     r.sex = "男";
    55                 }
    56                 else
    57                 {
    58                     r.name = "rose";
    59                     r.sex = "女女女";
    60                 }
    61             }
    62             x = (x+1)%2;//实现切换。
    63         }
    64     }
    65 }
    66 //获取值线程任务。
    67 class Output implements Runnable
    68 {
    69     private Resource r;
    70 //    private Object obj = new Object();
    71     Output(Resource r)
    72     {
    73         this.r = r;
    74     }
    75     public void run()
    76     {
    77         while(true)
    78         {
    79             synchronized(r)
    80             {
    81                 System.out.println(r.name+"...."+r.sex);
    82             }
    83         }
    84     }
    85 }
    86 class ThreadTest2
    87 {
    88     public static void main(String[] args) 
    89     {
    90         Resource r = new Resource();
    91         Input in = new Input(r);
    92         Output out = new Output(r);
    93         Thread t1 = new Thread(in);
    94         Thread t2 = new Thread(out);
    95         t1.start();
    96         t2.start();
    97     }
    98 }
      1 //day16多线程细节%Eclipse的使用。(需求二:正确数据的间隔输出)
      2 /*
      3 需求:
      4 资源有姓名和性别。
      5 两个线程:
      6     一个负责给姓名和性别赋值。
      7     一个负责获取姓名和性别的值。
      8 
      9 参阅ThreadTest2.java文件。
     10 
     11 要求:1,运行一下,解决程序中“妖”的问题。
     12     分析过程:
     13     加入同步,必须保证同一个锁,解决妖的问题。
     14 
     15 要求2:实现正确数据的间隔输出 如:
     16 张飞--男
     17 rose--女女女
     18 张飞--男
     19 rose--女女女
     20 使用等待唤醒机制。
     21 wait(),notify(),notifyAll();
     22 
     23 对于等待都需要判断,定义条件
     24 
     25 
     26 
     27 要求3:对代码进行重构。
     28     将name,sex私有化,资源类提供对其访问的方法。
     29 
     30 要求4:将程序改成JDK1.5的Lock Conditon接口。
     31 
     32 */
     33 //描述资源
     34 class Resource
     35 {
     36     String name;
     37     String sex;
     38     //定义标记
     39     boolean flag=false;
     40 }
     41 //赋值线程任务
     42 class Input implements Runnable
     43 {
     44     private Resource r;
     45 //    private Object obj = new Object();
     46     Input(Resource r)//任务一初始化就必须要处理的资源。
     47     {
     48         this.r = r;
     49     }
     50     public void run()
     51     {
     52         int x = 0;
     53         while(true)
     54         {
     55             synchronized(r)
     56             {
     57                 if(r.flag)
     58                     try{r.wait();}catch(InterruptedException e){}
     59                 if(x==0)
     60                 {
     61                     r.name = "张飞";
     62                     r.sex = "男";
     63                 }
     64                 else
     65                 {
     66                     r.name = "rose";
     67                     r.sex = "女女女";
     68                 }
     69                 r.flag = true;
     70                 r.notify();
     71             }
     72             x = (x+1)%2;//实现切换。
     73         }
     74     }
     75 }
     76 //获取值线程任务。
     77 class Output implements Runnable
     78 {
     79     private Resource r;
     80 //    private Object obj = new Object();
     81     Output(Resource r)
     82     {
     83         this.r = r;
     84     }
     85     public void run()
     86     {
     87         while(true)
     88         {
     89             synchronized(r)
     90             {
     91                 if(!r.flag)
     92                     try{r.wait();}catch(InterruptedException e){}
     93                 System.out.println(r.name+"...."+r.sex);
     94                 r.flag = false;
     95                 r.notify();
     96             }
     97         }
     98     }
     99 }
    100 class ThreadTest2_2
    101 {
    102     public static void main(String[] args) 
    103     {
    104         Resource r = new Resource();
    105         Input in = new Input(r);
    106         Output out = new Output(r);
    107         Thread t1 = new Thread(in);
    108         Thread t2 = new Thread(out);
    109         t1.start();
    110         t2.start();
    111     }
    112 }
      1 //day16多线程细节%Eclipse的使用。(需求二:正确数据的间隔输出)
      2 /*
      3 需求:
      4 资源有姓名和性别。
      5 两个线程:
      6     一个负责给姓名和性别赋值。
      7     一个负责获取姓名和性别的值。
      8 
      9 参阅ThreadTest2.java文件。
     10 
     11 要求:1,运行一下,解决程序中“妖”的问题。
     12     分析过程:
     13     加入同步,必须保证同一个锁,解决妖的问题。
     14 
     15 要求2:实现正确数据的间隔输出 如:
     16 张飞--男
     17 rose--女女女
     18 张飞--男
     19 rose--女女女
     20 使用等待唤醒机制。
     21 wait(),notify(),notifyAll();
     22 
     23 对于等待都需要判断,定义条件
     24 
     25 
     26 
     27 要求3:对代码进行重构。
     28     将name,sex私有化,资源类提供对其访问的方法。
     29 
     30 要求4:将程序改成JDK1.5的Lock Conditon接口。
     31 Lock替换了同步函数或者同步代码块。
     32 
     33 Condition替代了 监视器方法,将监视器方法从锁上分离出来,单独封装Condition对象。
     34 
     35 */
     36 //描述资源
     37 class Resource
     38 {
     39     private String name;
     40     private String sex;
     41     //定义标记
     42     private boolean flag=false;
     43 
     44     //赋值功能。
     45     public synchronized void set(String name,String sex)
     46     {
     47         if(flag)
     48             try{this.wait();}catch(InterruptedException e){}
     49         this.name = name;
     50         this.sex = sex;
     51         flag = true;
     52         this.notify();
     53     }
     54     //获取值。
     55     public synchronized void out()
     56     {
     57         if(!flag)
     58             try{this.wait();}catch(InterruptedException e){}
     59         System.out.println(name+"........"+sex);
     60         flag = false;
     61         this.notify();
     62     }
     63 }
     64 //赋值线程任务
     65 class Input implements Runnable
     66 {
     67     private Resource r;
     68 //    private Object obj = new Object();
     69     Input(Resource r)//任务一初始化就必须要处理的资源。
     70     {
     71         this.r = r;
     72     }
     73     public void run()
     74     {
     75         int x = 0;
     76         while(true)
     77         {
     78                 if(x==0)
     79                 {
     80                     r.set("张飞","男");
     81                 }
     82                 else
     83                 {
     84                     r.set("rose","女女女");
     85                 }
     86             x = (x+1)%2;//实现切换。
     87         }
     88     }
     89 }
     90 //获取值线程任务。
     91 class Output implements Runnable
     92 {
     93     private Resource r;
     94 //    private Object obj = new Object();
     95     Output(Resource r)
     96     {
     97         this.r = r;
     98     }
     99     public void run()
    100     {
    101         while(true)
    102         {
    103                 r.out();
    104         }
    105     }
    106 }
    107 class ThreadTest2_3
    108 {
    109     public static void main(String[] args) 
    110     {
    111         Resource r = new Resource();
    112         Input in = new Input(r);
    113         Output out = new Output(r);
    114         Thread t1 = new Thread(in);
    115         Thread t2 = new Thread(out);
    116         t1.start();
    117         t2.start();
    118     }
    119 }
      1 //day16多线程细节%Eclipse的使用。(需求二:正确数据的间隔输出)
      2 /*
      3 需求:
      4 资源有姓名和性别。
      5 两个线程:
      6     一个负责给姓名和性别赋值。
      7     一个负责获取姓名和性别的值。
      8 
      9 参阅ThreadTest2.java文件。
     10 
     11 要求:1,运行一下,解决程序中“妖”的问题。
     12     分析过程:
     13     加入同步,必须保证同一个锁,解决妖的问题。
     14 
     15 要求2:实现正确数据的间隔输出 如:
     16 张飞--男
     17 rose--女女女
     18 张飞--男
     19 rose--女女女
     20 使用等待唤醒机制。
     21 wait(),notify(),notifyAll();
     22 
     23 对于等待都需要判断,定义条件
     24 
     25 
     26 
     27 要求3:对代码进行重构。
     28     将name,sex私有化,资源类提供对其访问的方法。
     29 
     30 要求4:将程序改成JDK1.5的Lock Conditon接口。
     31 Lock替换了同步函数或者同步代码块。
     32 
     33 Condition替代了 监视器方法,将监视器方法从锁上分离出来,单独封装Condition对象。
     34 
     35 */
     36 //描述资源
     37 
     38 import java.util.concurrent.locks.*;
     39 class Resource
     40 {
     41     private String name;
     42     private String sex;
     43     //定义标记
     44     private boolean flag=false;
     45 
     46     //1.先创建锁对象。
     47     private final Lock lock = new ReentrantLock();
     48 
     49     //通过锁对象获取监视器对象。
     50     private Condition con = lock.newCondition();
     51 
     52     //赋值功能。
     53     public void set(String name,String sex)
     54     {
     55         lock.lock();
     56         try{
     57             if(flag)
     58                 try{con.await();}catch(InterruptedException e){}
     59             this.name = name;
     60             this.sex = sex;
     61             flag = true;
     62             con.signal();
     63         }finally{
     64             lock.unlock();
     65         }
     66     }
     67     //获取值。
     68     public void out()
     69     {
     70         lock.lock();
     71         try{
     72             if(!flag)
     73                 try{con.await();}catch(InterruptedException e){}
     74             System.out.println(name+"........"+sex);
     75             flag = false;
     76             con.signal();
     77         }finally{
     78             lock.unlock();
     79         }
     80     }
     81 }
     82 //赋值线程任务
     83 class Input implements Runnable
     84 {
     85     private Resource r;
     86 //    private Object obj = new Object();
     87     Input(Resource r)//任务一初始化就必须要处理的资源。
     88     {
     89         this.r = r;
     90     }
     91     public void run()
     92     {
     93         int x = 0;
     94         while(true)
     95         {
     96                 if(x==0)
     97                 {
     98                     r.set("张飞","男");
     99                 }
    100                 else
    101                 {
    102                     r.set("rose","女女女");
    103                 }
    104             x = (x+1)%2;//实现切换。
    105         }
    106     }
    107 }
    108 //获取值线程任务。
    109 class Output implements Runnable
    110 {
    111     private Resource r;
    112 //    private Object obj = new Object();
    113     Output(Resource r)
    114     {
    115         this.r = r;
    116     }
    117     public void run()
    118     {
    119         while(true)
    120         {
    121                 r.out();
    122         }
    123     }
    124 }
    125 class ThreadTest2_4
    126 {
    127     public static void main(String[] args) 
    128     {
    129         Resource r = new Resource();
    130         Input in = new Input(r);
    131         Output out = new Output(r);
    132         Thread t1 = new Thread(in);
    133         Thread t2 = new Thread(out);
    134         t1.start();
    135         t2.start();
    136     }
    137 }
     1 class ThreadTest 
     2 {
     3     public static void main(String[] args) 
     4     {
     5         /*
     6         new Thread(){
     7             public void run()
     8             {
     9                 for(int x=0;x<40;x++)
    10                 {
    11                     System.out.println(Thread.currentThread().getName()+"..X.."+x);
    12                 }
    13             }
    14         }.start();
    15         
    16         Runnable r = new Runnable(){
    17             public void run(){
    18                     for(int x=0;x<40;x++)
    19                 {
    20                     System.out.println(Thread.currentThread().getName()+"..Y.."+x);
    21                 }
    22             }
    23         };
    24     
    25         new Thread(r).start();
    26 
    27         for(int x=0;x<40;x++)
    28         {
    29             System.out.println(Thread.currentThread().getName()+"..Z.."+x);
    30         }
    31 
    32         */
    33         //面试题:
    34         new Thread(new Runnable()
    35         {
    36             public void run()
    37             {
    38                 System.out.println("runnbable run");
    39             }
    40         }){
    41             public void run()
    42             {
    43                 System.out.println("subthread run");
    44             }
    45         }.start();
    46     }
    47 }
    48 
    49 
    50 
    51 
    52 /*
    53 class Thread
    54 {
    55     private Runnable r;
    56     Thread(Runnable r)
    57     {
    58         this.r = r;
    59     }
    60     public void run()
    61     {
    62         if(r!=null)
    63         {
    64             r.run();
    65         }
    66     }
    67     public void start()
    68     {
    69         run();
    70     }
    71 }
    72 
    73 class SubThread extends Thread
    74 {
    75     public void run()
    76     {
    77         System.out.println("subthread run");
    78     }
    79 }
    80 
    81 Runnable r = new Runnable()
    82 {
    83     public void run()
    84     {
    85         System.out.println("runnable run");
    86     }
    87 }
    88 
    89 SubThread t = new SubThread(r);
    90 t.start();
    91 */
     1 //演示停止线程。
     2 class Demo implements Runnable
     3 {
     4     private boolean flag = true;
     5     public synchronized void run()
     6     {
     7         while(flag)
     8         {
     9             try
    10             {
    11                 wait();//t1 t2 
    12             }
    13             catch (InterruptedException e)
    14             {
    15                 System.out.println(Thread.currentThread().toString()+"..."+e.toString());
    16                 changeFlag();
    17             }
    18             System.out.println(Thread.currentThread().getName()+"--->");
    19         }
    20     }
    21     //对标记的修改方法。
    22     public void changeFlag()
    23     {
    24         flag = false;
    25     }
    26 }
    27 
    28 class StopThreadDemo
    29 {
    30     public static void main(String[] args) 
    31     {
    32         Demo d = new Demo();
    33 
    34         Thread t1 = new Thread(d,"旺财");
    35         Thread t2 = new Thread(d,"小强");
    36         t1.start();
    37         //将t2标记为守护线程,也叫后台线程。
    38         t2.setDaemon(true);
    39         t2.start();
    40 
    41         int x = 0;
    42         while(true)
    43         {
    44             if(++x == 50)//条件满足。
    45             {
    46 //                d.changeFlag();//改变线程任务代码标记。让其他线程也结束。
    47                 //强制对t1线程对象中断状态的清除。强制让其恢复到运行状态。
    48                 t1.interrupt();
    49                 //强制对t1线程对象中断状态的清除。强制让其恢复到运行状态。
    50                 t2.interrupt();
    51                 break;//跳出循环。主线程可以结束。
    52             }
    53             System.out.println("main------->"+x);
    54         }
    55         System.out.println("over");
    56     }
    57 }
     1 class Demo implements Runnable
     2 {
     3     public void run()
     4     {
     5         for(int x=1;x<=20;x++)
     6         {
     7             System.out.println(Thread.currentThread().getName()+"---->"+x);
     8             Thread.yield();//线程临时暂停。将执行权释放。让其他线程有机会获取。
     9         }
    10     }
    11 
    12 }
    13 class JoinThreadDemo
    14 {
    15     public static void main(String[] args) 
    16     {
    17         Demo d = new Demo();
    18         Thread t1 = new Thread(d);
    19         Thread t2 = new Thread(d);
    20         
    21         //主线程执行到这里,知道t1要加入执行,主线程释放了执行权,和执行资格,并处于冻结状态
    22         //什么时候恢复呢?等待t1线程执行完。
    23         t1.start();
    24         t2.start();
    25         //try{t1.join();}catch(InterruptedException e){}//用于临时加入一个线程,该线程运算完,程序才会继续执行。
    26 
    27         for(int x=1;x<=20;x++)
    28         {
    29             System.out.println("main------->"+x);
    30         }
    31         System.out.println("over");
    32     }
    33 }
  • 相关阅读:
    gitlab 升级
    通过 备份文件 恢复/迁移 gitlab
    gitlab 远程 定时备份
    PHP 中替换若干字符串字串为数组中的值,不用循环,非常高效
    php 在客户端生成txt文件并且下载
    Mysql时间戳函数
    mysql中在表中insert数据时,有重复主键id时,变成update
    css中解决img在a元素中使得a元素撑大写法
    php以excel的形式将数据输出
    css中常用的hack
  • 原文地址:https://www.cnblogs.com/sun-/p/5424361.html
Copyright © 2011-2022 走看看