多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();

多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();

在多线程中所有的操作方法都是从Thread类开始的,所有的操作基本都在Thread类中。

第一取得线程名字

a,在Thread类中,可以通过getName()方法,获得线程的名字,可以通过setName()方法设置线程的名字

b,线程名字一般在线程启动前设置,但是也允许为已经运行的线程设置名称,允许2个Thread对象有相
同的名字,但是不推荐,你懂的!!!

c,如果程序没有为线程指定名字,则系统自动为线程分配一个名称。

复制代码

    package xianchengcaozuo;  
      
    public class ThreadName {  
     public static void main(String[] args) {  
         Demo d1= new Demo();  
         Thread t1= new Thread(d1);  
         Thread t2= new Thread(d1,"线程A");  
         Thread t3= new Thread(d1,"线程B");  
         Thread t4= new Thread(d1);  
         t1.start();  
         t2.start();  
         t3.start();  
         t4.start();  
    }  
    }  
    class Demo implements Runnable{  
      
        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            for(int i=0;i<5;i++){  
                System.out.println(Thread.currentThread().getName()+"运行,i="+i);  
            }  
              
        }  
          
          
          
    }  

复制代码

复制代码

Thread-0运行,i=0  
Thread-0运行,i=1  
Thread-0运行,i=2  
线程A运行,i=0  
线程A运行,i=1  
线程A运行,i=2  
Thread-0运行,i=3  
Thread-0运行,i=4  
线程A运行,i=3  
线程A运行,i=4  
线程B运行,i=0  
线程B运行,i=1  
线程B运行,i=2  
线程B运行,i=3  
线程B运行,i=4  
Thread-1运行,i=0  
Thread-1运行,i=1  
Thread-1运行,i=2  
Thread-1运行,i=3  
Thread-1运行,i=4 

复制代码

没指定名字,则按编号!!

第二 获取当前线程对象currentThread()

第三判断线程是否启动成功 isAlive()

第四 强制运行线程

复制代码

    package xianchengcaozuo;  
    /* 
     * 强制运行线程用join方法,期间其它线程无法运行,必须等待此线程 
     * 执行完后,其它线程才可以执行 
     */  
    public class Qiangzhi {  
        public static void main(String[] args) {  
            Demo1 d1= new Demo1();  
            Thread t1= new Thread(d1,"线程A");  
            t1.start();  
            for(int i=0;i<50;i++){  
                if(i>10){  
                    try {  
                        t1.join();  
                    } catch (InterruptedException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                }  
                System.out.println("main线程运行:"+i);  
            }  
              
        }  
    }  
    class Demo1 implements Runnable{  
      
        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            for(int i=0;i<50;i++){  
                System.out.println(Thread.currentThread().getName()+"运行,i="+i);  
            }  
              
        }  
          
          
          
    }  

复制代码

结果:

复制代码

main线程运行:0  
main线程运行:1  
main线程运行:2  
main线程运行:3  
main线程运行:4  
main线程运行:5  
main线程运行:6  
main线程运行:7  
main线程运行:8  
main线程运行:9  
main线程运行:10  
线程A运行,i=0  
线程A运行,i=1  
线程A运行,i=2  
线程A运行,i=3  
线程A运行,i=4  
线程A运行,i=5  
线程A运行,i=6  
线程A运行,i=7  
线程A运行,i=8  
线程A运行,i=9  
线程A运行,i=10  
线程A运行,i=11  
线程A运行,i=12  
线程A运行,i=13  
线程A运行,i=14  
线程A运行,i=15  
线程A运行,i=16  
线程A运行,i=17  
线程A运行,i=18  
线程A运行,i=19  
线程A运行,i=20  
线程A运行,i=21  
线程A运行,i=22  
线程A运行,i=23  
线程A运行,i=24  
线程A运行,i=25  
线程A运行,i=26  
线程A运行,i=27  
线程A运行,i=28  
线程A运行,i=29  
线程A运行,i=30  
线程A运行,i=31  
线程A运行,i=32  
线程A运行,i=33  
线程A运行,i=34  
线程A运行,i=35  
线程A运行,i=36  
线程A运行,i=37  
线程A运行,i=38  
线程A运行,i=39  
线程A运行,i=40  
线程A运行,i=41  
线程A运行,i=42  
线程A运行,i=43  
线程A运行,i=44  
线程A运行,i=45  
线程A运行,i=46  
线程A运行,i=47  
线程A运行,i=48  
线程A运行,i=49  
main线程运行:11  
main线程运行:12  
main线程运行:13  
main线程运行:14  
main线程运行:15  
main线程运行:16  
main线程运行:17  
main线程运行:18  
main线程运行:19  
main线程运行:20  
main线程运行:21  
main线程运行:22  
main线程运行:23  
main线程运行:24  
main线程运行:25  
main线程运行:26  
main线程运行:27  
main线程运行:28  
main线程运行:29  
main线程运行:30  
main线程运行:31  
main线程运行:32  
main线程运行:33  
main线程运行:34  
main线程运行:35  
main线程运行:36  
main线程运行:37  
main线程运行:38  
main线程运行:39  
main线程运行:40  
main线程运行:41  
main线程运行:42  
main线程运行:43  
main线程运行:44  
main线程运行:45  
main线程运行:46  
main线程运行:47  
main线程运行:48  
main线程运行:49 

复制代码

第五 线程的休眠

复制代码

    package xianchengcaozuo;  
      
    import java.util.Date;  
      
    /* 
     * 通过sleep方法,可以使线程暂停执行 
     *  
     */  
    public class ThreadSleep {  
        public static void main(String[] args) {  
            Demo2 d1= new Demo2();  
            Thread t1= new Thread(d1,"线程C");  
            t1.start();  
            }  
        }  
      
    class Demo2 implements Runnable{  
      
        @Override  
        public void run() {  
          
            for(int i=0;i<10;i++){  
                try {  
                    //此处是毫秒  
                    Thread.sleep(5000);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }     
                System.out.println(new Date());  
                    System.out.println(Thread.currentThread().getName()+"运行,i="+i);  
            }  
        }  
          
          
          
    }  

复制代码

复制代码

    Tue Apr 22 11:10:40 CST 2014  
    线程C运行,i=0  
    Tue Apr 22 11:10:45 CST 2014  
    线程C运行,i=1  
    Tue Apr 22 11:10:50 CST 2014  
    线程C运行,i=2  
    Tue Apr 22 11:10:55 CST 2014  
    线程C运行,i=3  
    Tue Apr 22 11:11:00 CST 2014  
    线程C运行,i=4  

复制代码

线程终止:

如果主线程是5000,那么会先run正常,在被终止

复制代码

    package xianchengcaozuo;  
    //当一个线程运行的时候,另一个线程可以通过interrupt方法种植其线程.  
      
      
    class MyThread09 implements Runnable {  
        public void run() {  
            System.out.println("1、进入run方法");  
            for (int i = 0; i < 5; i++) {  
                try {  
                    Thread.sleep(5000);  
                    System.out.println("2、休眠已经完成");  
                } catch (Exception e) {  
                    System.out.println("3、休眠被终止");  
                    return;  
                }  
                System.out.println("4、run方法正常结束");  
            }  
        }  
    }  
    class Threadinterrupt{  
        public static void main(String[] args) {  
            MyThread09 my = new MyThread09();  
            Thread t = new Thread(my,"线程");  
            t.start();  
            try {  
                Thread.sleep(2000);  
            } catch (Exception e) {  
            }  
            t.interrupt();  
        }  
    }  

复制代码

    1、进入run方法  
    3、休眠被终止  

线程的优先级:

复制代码

    package xianchengcaozuo;  
      
    public class Threadjibie {  
        public static void main(String[] args) {  
            Demo5 my = new Demo5();  
            Thread t1 = new Thread(my,"线程A");  
            Thread t2 = new Thread(my,"线程B");  
            Thread t3 = new Thread(my,"线程C");  
            //设置线程优先级  
            t1.setPriority(Thread.MIN_PRIORITY);  
            t2.setPriority(Thread.NORM_PRIORITY);  
            t3.setPriority(Thread.MAX_PRIORITY);  
            t1.start();  
            t2.start();  
            t3.start();  
        }  
    }  
    class Demo5 implements Runnable {  
        public void run() {  
            for (int i = 0; i < 5; i++) {  
                try {  
                    Thread.sleep(500);  
                } catch (Exception e) {  
                }  
                System.out.println(Thread.currentThread().getName() + "运行,i = " + i);  
            }  
        }  
        }  

复制代码

复制代码

    线程C运行,i = 0  
    线程B运行,i = 0  
    线程A运行,i = 0  
    线程C运行,i = 1  
    线程B运行,i = 1  
    线程A运行,i = 1  
    线程C运行,i = 2  
    线程B运行,i = 2  
    线程A运行,i = 2  
    线程C运行,i = 3  
    线程B运行,i = 3  
    线程A运行,i = 3  
    线程C运行,i = 4  
    线程B运行,i = 4  
    线程A运行,i = 4  

复制代码


主方法的优先级是中级

线程的礼让:

复制代码

    package xianchengcaozuo;  
    //yield(),线程礼让,将操作让给其它线程  
    public class ThreadLirang {  
        public static void main(String[] args) {  
            Demo6 d1= new Demo6();  
              
            Thread t1 = new Thread(d1);  
            Thread t2 = new Thread(d1);  
            t1.start();  
            t2.start();  
              
        }  
    }  
    class Demo6 implements Runnable{  
      
        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            for(int i=0;i<5;i++){  
                System.out.println(Thread.currentThread().getName()+"运行,i="+i);  
                if(i==3){  
                    Thread.currentThread().yield();  
                    System.out.println(Thread.currentThread().getName()+"礼让");  
                }  
            }  
        }  
          
          
          
    }  

复制代码

结果: Thread-1运行,i=0
Thread-1运行,i=1
Thread-1运行,i=2
Thread-1运行,i=3
Thread-0运行,i=0
Thread-0运行,i=1
Thread-0运行,i=2
Thread-0运行,i=3
Thread-0礼让
Thread-0运行,i=4
Thread-1礼让
Thread-1运行,i=4

Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,

让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。

        yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保

证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

      举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,

有可能是其他人先上车了,也有可能是Yield先上车了。

     但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,

最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。

猜你喜欢

转载自blog.csdn.net/runrun117/article/details/82561981