zoukankan      html  css  js  c++  java
  • java学习笔记 --- 多线程(多线程的控制)

    1、线程休眠
          public static void sleep(long millis)

    public class ThreadSleep extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x + ",日期:" + new Date());
                // 睡眠
                // 困了,我稍微休息1秒钟
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    /*
     * 线程休眠
     *        public static void sleep(long millis)
     */
    public class ThreadSleepDemo {
        public static void main(String[] args) {
            ThreadSleep ts1 = new ThreadSleep();
            ThreadSleep ts2 = new ThreadSleep();
            ThreadSleep ts3 = new ThreadSleep();
    
            ts1.setName("林青霞");
            ts2.setName("林志玲");
            ts3.setName("林志颖");
    
            ts1.start();
            ts2.start();
            ts3.start();
        }
    }

    2 、加入线程:加入进来的线程执行结束后才执行其他线程

        public final void join():等待该线程终止,才执行其他线程

    public class ThreadJoin extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    }
    
    /*
     * public final void join():等待该线程终止。 
     */
    public class ThreadJoinDemo {
        public static void main(String[] args) {
            ThreadJoin tj1 = new ThreadJoin();
            ThreadJoin tj2 = new ThreadJoin();
            ThreadJoin tj3 = new ThreadJoin();
    
            tj1.setName("李渊");
            tj2.setName("李世民");
            tj3.setName("李元霸");
            //先执行完"李渊"在执行其他线程
            tj1.start();
            try {
                tj1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            tj2.start();
            tj3.start();
        }
    }
        

    3、礼让线程:暂停当前正在执行的线程对象,并执行其他线程。

      public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
                让多个线程的执行更和谐,但是不能靠它保证一人一次。

    public class ThreadYield extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
           //调用礼让线程方法 Thread.yield(); } } }
    /* * public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 * 让多个线程的执行更和谐,但是不能靠它保证一人一次。 */ public class ThreadYieldDemo { public static void main(String[] args) { ThreadYield ty1 = new ThreadYield(); ThreadYield ty2 = new ThreadYield(); ty1.setName("线程1"); ty2.setName("线程2"); ty1.start(); ty2.start(); } }

    4、后台线程(守护线程):主线程结束后,守护线程也会跟着终止

      public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。

      守护线程和一般线程的区别:

      1、守护线程就是main同生共死,当main退出,它将终止,而普通线程是在任务执行结束才停止。

      2、Java虚拟机在它所有非守护线程已经离开后自动离开。守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。

    public class ThreadDaemon extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    }
    /*
     * public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
     * 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。 
     * 
     * 游戏:坦克大战。
     */
    public class ThreadDaemonDemo {
        public static void main(String[] args) {
            ThreadDaemon td1 = new ThreadDaemon();
            ThreadDaemon td2 = new ThreadDaemon();
    
            td1.setName("关羽");
            td2.setName("张飞");
    
            // 设置收获线程
            td1.setDaemon(true);
            td2.setDaemon(true);
        //守护线程必须在线程启动前设置
            td1.start();
            td2.start();
    
            Thread.currentThread().setName("刘备");
            for (int x = 0; x < 5; x++) {
                System.out.println(Thread.currentThread().getName() + ":" + x);
            }
        }
    }
                

    5、终止线程

      public final void stop():让线程停止,过时了,但是还可以使用。
        public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。

    public class ThreadStop extends Thread {
        @Override
        public void run() {
            System.out.println("开始执行:" + new Date());
    
            // 我要休息10秒钟,亲,不要打扰我哦
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // e.printStackTrace();
                System.out.println("线程被终止了");
            }
    
            System.out.println("结束执行:" + new Date());
        }
    }
    /*
     * public final void stop():让线程停止,过时了,但是还可以使用。
     * public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。
     */
    public class ThreadStopDemo {
        public static void main(String[] args) {
            ThreadStop ts = new ThreadStop();
            ts.start();
    
            // 你超过三秒不醒过来,我就干死你
            try {
                Thread.sleep(3000);
                // ts.stop();
                ts.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    6、线程的优先级设置

        线程默认优先级是5。
        线程优先级的范围是:1-10。
        线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

        设置线程优先级的方法:

          public final int getPriority():返回线程对象的优先级

          public final void setPriority(int newPriority):更改线程的优先级

        IllegalArgumentException:非法参数异常。
          抛出的异常表明向方法传递了一个不合法或不正确的参数

    public class ThreadPriority extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    }
    public class ThreadPriorityDemo {
        public static void main(String[] args) {
            ThreadPriority tp1 = new ThreadPriority();
            ThreadPriority tp2 = new ThreadPriority();
            ThreadPriority tp3 = new ThreadPriority();
    
            tp1.setName("东方不败");
            tp2.setName("岳不群");
            tp3.setName("林平之");
    
            // 获取默认优先级,线程的默认优先级为5
            // System.out.println(tp1.getPriority());
            // System.out.println(tp2.getPriority());
            // System.out.println(tp3.getPriority());
    
            // 设置线程优先级,错误:线程的优先级范围:1-10
            // tp1.setPriority(100000);
            
            //设置正确的线程优先级
            tp1.setPriority(10);
            tp2.setPriority(1);
    
            tp1.start();
            tp2.start();
            tp3.start();
        }
    }
  • 相关阅读:
    Git常用命令
    C++ 四种强制类型转换
    Linux系统日志及日志分析
    C/C++中的getline函数总结:
    标准C++中的string类的用法总结
    C++中map的基本操作和使用;
    一个C++类的注释:
    C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
    c++ 的vector
    c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/flei/p/6622989.html
Copyright © 2011-2022 走看看