• 多线程(守护线程、join方法、线程优先级、线程组)


    setDaemon(boolean on):

    守护线程(后台线程),若前台(显示)线程都结束了则后台线程自动结束。

    使用setDaemon(boolean on)方法,必须在开启线程前将线程标记为守护线程。

    示例:

    class setDaemon implements Runnable
    {
        public void run()
        {
            while (true)
            {
                System.out.println(Thread.currentThread().getName()+"...run");
            }
        }
    }
    
    class setDaemonDemo 
    {
        public static void main(String[] args) 
        {
            setDaemon sd = new setDaemon();
    
            Thread t1 = new Thread(sd);
            Thread t2 = new Thread(sd);
            //将t1、t2标记为守护线程。(若要使一线程成为守护线程必须要在它开启前标记)
            t1.setDaemon(true);
            t2.setDaemon(true);
    
            t1.start();
            t2.start();
            //前台main线程,若main线程结束,则t1、t2自动结束
            for (int i=0;i<60;i++)
            {
                System.out.println(Thread.currentThread().getName()+"......"+i);
            }
        }
    }
    守护线程示例

    join():

    join方法能使线程取得cpu执行权,而将执行权交给调用了join方法的线程则必须等使用了join方法的线程执行完才能开始执行

    (当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。

    join可以用来临时加入线程执行。)

    示例:

    class join implements Runnable
    {
        public void run()
        {
            for (int i=0; i<70; i++)
            {
                System.out.println(Thread.currentThread().getName()+"..."+i);
            }
        }
    }
    
    class joinDemo 
    {
        public static void main(String[] args) 
        {
            join j = new join();
    
            Thread t1 = new Thread(j);
            Thread t2 = new Thread(j);
    
            t1.start();
            //main线程执行到join时将执行权交给了t1,main线程陷入休眠状态。t1执行完了,main才能开始执行。
            //而此时只有main 和 t1线程,t2未开启
            try
            {
                t1.join();
            }
            catch (InterruptedException e)
            {
            }
    
            t2.start();
            for (int i=0; i<70; i++)
            {
                System.out.println(Thread.currentThread().getName()+"..............."+i);
            }
        }
    }
    joinDemo

    线程组:

    某一线程是哪一条线程开启的它就是那一组的线程,(A线程是B线程开启的,A线程就是B组的)

    ThreadGroup类(线程组类)提供了线程组的操作,但实际开发中很少用到。

    线程优先级:

    优先级分为1到10,1最小10最大。

    setPriority(int num):设置线程的优先级,

    MAX_PRIORITY:设置最高优先级、MIN_PRIORITY:设置最低优先级、NORM_PRIORITY分配给线程默认的优先级(5)。

    //设置线程优先级演示
    class SetThreadPriorityDemo implements Runnable
    {
        public void run()
        {
            for(int number=0; number<60; number++)
            {
                System.out.println(Thread.currentThread().getName()+":"+number);
            }
        }
    }
    
    //线程优先级演示
    class ThreadPriorityDemo 
    {
        public static void main(String[] args) 
        {
            SetThreadPriorityDemo st = new SetThreadPriorityDemo();
    
            Thread t1 = new Thread(st);
            Thread t2 = new Thread(st);
            Thread t3 = new Thread(st);
            //通过线程类Thread的toString()方法打印线程的信息,包括线程名称、优先级、线程组
            System.out.println(t1.toString());
            System.out.println(t2.toString());
            System.out.println(t3.toString());
    
            //设置线程的优先级
            //MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY三个为Thread类定义的三个代表线程优先级的静态常量数值
            t1.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY代表最高优先级10.
            t2.setPriority(Thread.MIN_PRIORITY);//MIN_PRIORITY代表最低优先级1.
            t3.setPriority(Thread.NORM_PRIORITY);//NORM_PRIORITY代表默认优先级5.
    
            //开启线程。
            t1.start();
            t2.start();
            t3.start();
        }
    }
    设置线程优先级演示

    yield方法:

    暂停当前正在执行的线程对象,并执行其他线程。

  • 相关阅读:
    30流的使用和分类
    使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库
    29防止程序集被篡改仿冒,全局程序集缓存GAC
    报错:不允许保存更改。您所做的更改要求删除并重新创建以下表……
    28先判断是否存在,再创建文件夹或文件,递归计算文件夹大小
    27程序集资源
    MVC缓存02,使用数据层缓存,添加或修改时让缓存失效
    26复杂类型比较,使用Compare .NET objects组件
    25LINQ拾遗及实例
    MVC缓存01,使用控制器缓存或数据层缓存
  • 原文地址:https://www.cnblogs.com/gzc911/p/4908938.html
Copyright © 2020-2023  润新知