• Java中Thread的常用方法


     1 /*
     2  *Thread常用方法
     3  *1.start():启动当前的线程,调用当前线程的run()
     4  *2.run():通常需要重写Thread类中的此方法,将创建要执行的操作声明在此方法中
     5  *3.currentThread():静态方法,返回代码执行的线程
     6  *4.getName():获取当前线程的名字
     7  *5.setName():设置当前线程的名字
     8  *6.yield():释放当前CPU的执行
     9  *7.join():在线程a中调用线程b的join()方法,此时线程a进入阻塞状态
    10  *8.stop():已过时的方法,当执行此方法是,强制结束当前进程
    11  *9.sleep(long millitime):让当前进程睡眠指定的毫秒数,在指定时间内,线程是阻塞状态
    12  *10.isAlive():判断进程是否存活
    13  */
    14 class HelloThread extends Thread
    15 {
    16     public void run()
    17     {
    18         for(int i=1;i<20;i++)
    19         {
    20             if((i&1)==0)
    21             {/*
    22             sleep(),是静态的可以直接通过类调用,会抛异常
    23             HelloThread是继承在Thread里的,在Thread里run()没有抛异常(子类重写方法抛出的异常<=父类被重写异常抛出的方法),
    24             所以此处不可以throws,只能用try-catch
    25             */
    26                 try {
    27                     sleep(1000);//阻塞1000ms,即1s
    28                 } catch (InterruptedException e) {
    29                     // TODO Auto-generated catch block
    30                     e.printStackTrace();
    31                 }
    32                 //在1s阻塞后,等CPU分配资源再运行主程序
    33                 System.out.println(Thread.currentThread().getName()+":"+i);
    34             }
    35             if(i%10==0)
    36             {
    37                 this.yield();
    38             }
    39         }
    40     }
    41     /*在源码中可以看到 Thread有对于名字命名的构造器
    42      * public Thread(String name) {
    43      *    init(null, null, name, 0);
    44      * }
    45      * 所以子类继承父类的构造器就行
    46      */
    47     /*
    48     public HelloThread(String name)
    49     {
    50         super(name);
    51     }
    52     */
    53 }
    54 public class test{
    55     public static void main(String[] args) {
    56         //给线程命名方法1 调用setName()
    57         HelloThread h1=new HelloThread();
    58         HelloThread h2=new HelloThread();
    59         h1.setName("*1*");
    60         h2.setName("*2*");
    61         h1.start();
    62         h2.start();
    63         //给线程命名方法2 建立类对象,调用构造器
    64         /*
    65          *HelloThread h2=new HelloTHread("*2*"); 
    66          */
    67         //给主线程命名
    68         Thread.currentThread().setName("主线程");
    69         for(int i=0;i<20;i++)
    70         {
    71             if((i&1)==1)
    72             {
    73                 System.out.println(Thread.currentThread().getName()+":"+i);
    74             }
    75             if(i==10)
    76             {
    77                 try {//主线程中调用h1的join()方法,此时主线程进入阻塞状态
    78                     h1.join();//join是Thread中的方法,不是该类中的方法,只能通过继承Thread类的子类对象调用
    79                 } catch (InterruptedException e) {
    80                     // TODO Auto-generated catch block
    81                     e.printStackTrace();
    82                 }
    83             }
    84         }
    85     }
    86 }

    通过上述学习的方法,我们来完成一个具体的例子。 

    创建三个窗口共卖100张票。(暂时忽略线程不安全即出现重票现象)

    1.通过类继承Thread实现

     1 //创建三个窗口共卖100张票
     2 
     3 class Window extends Thread
     4 {
     5     private static int ticket=100;
     6     public void run()
     7     {
     8         while(true)
     9         {
    10             if(ticket>0)
    11             {
    12                 System.out.println(getName()+":卖票,票号为:"+ticket);
    13                 ticket--;
    14             }
    15             else
    16                 break;
    17         }
    18     }
    19 }
    20 public class test
    21 {
    22     public static void main(String[] args)
    23     {
    24         Window t1=new Window();
    25         Window t2=new Window();
    26         Window t3=new Window();
    27         t1.setName("*1*");
    28         t2.setName("*2*");
    29         t3.setName("*3*");
    30         t1.start();
    31         t2.start();
    32         t3.start();
    33     }
    34 }

    2.通过类调用接口实现

     1 //创建三个窗口共卖100张票
     2 class Window implements Runnable
     3 {
     4     private int ticket=100;
     5     public void run()
     6     {
     7         while(true)
     8         {
     9             if(ticket>0)
    10             {
    11                 System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket);
    12                 ticket--;
    13             }
    14             else
    15                 break;
    16         }
    17     }
    18 }
    19 public class test{
    20     public static void main(String[] args) {
    21         Window w=new Window();//因为只造了一个Window类对象,3个线程公用一个进程,所以不用把ticket声明为静态的
    22         Thread t1=new Thread(w);
    23         Thread t2=new Thread(w);
    24         Thread t3=new Thread(w);
    25         t1.setName("1");
    26         t1.setName("2");
    27         t1.setName("3");
    28         t1.start();
    29         t2.start();
    30         t3.start();
    31     }
    32 }
  • 相关阅读:
    2716 [Violet 3] 天使玩偶
    BZOJ1017魔兽地图DotR 樹形DP
    BZOJ1016最小生成树计数 最小生成树 + 排列组合
    BZOJ1014火星人prefix Splay維護序列 + 字符串哈希
    BZOJ1010玩具裝箱Toy
    BZOJ1009GT考试 DP + KMP + 矩陣快速冪
    BZOJ1008[HNOI2008]越狱
    BZOJ1006神奇的国度 弦圖染色 最大勢算法
    BZOJ1005明明的烦恼 Prufer + 分解質因數 + 高精度
    poj2182(线段树求序列第k小)
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/10833447.html
Copyright © 2020-2023  润新知