线程的基本操作,java中实现线程有哪两种基本方法

  线程的基本操作,java中实现线程有哪两种基本方法

  00-1010线程的常用操作守护线程(后台线程)线程序列化线程优先级线程中断

  00-1010设置线程名:setName()

  获取线程名:getName()

  唯一线程id: getid()

  //自定义线程名称StringthreadName= threadName//构造方法模式thread thread=new thread()-{ system . out . println( thread name= thread . current thread())。getname()));},thread name);//设置方法模式//thread . setname(thread name);system . out . println( thread unique Id= thread . getid());启动线程:Start()

  判断线程是否存活:isAlive()

  //Thread starts Thread . start();System.out.println(是否是live thread= thread . isa live());方法:run() /call()

  线程启动后将调用的方法。线程要做的事情写在run/call方法里,不需要直接调用。线程启动后,会调用run() /call()本身。如果程序在不启动线程的情况下直接调用run/call,就不属于多线程编程,而是属于当前线程直接调用普通方法。

  获取当前线程对象:当前线程()

  要操作当前线程的非静态方法,必须先获取thread对象。

  //获取当前线程对象threadcurrentthread=thread . currentthread();//对当前线程system . out . println(current thread . getname())做点什么;Try{//sleep静态方法不需要thread . sleep(1000);} catch(interrupted exception e){ e . printstacktrace();}关于线程的状态控制(生命周期)的操作,请参考上一篇文章。

  00-1010普通线程(用户线程)的守护者,其任务是为其他线程提供服务。如果进程中没有用户线程,那么守护线程就没有任何意义,JVM也将结束。典型的守护线程是JVM的垃圾收集线程,操作系统的启动也会启动各个模块的守护线程。

  将线程设置为守护线程:setDaeman()

  注意:这个方法必须在start()方法之前调用。

  PublicStaticVoidMain(string[]args){ thread thread=new thread(()-{ system . out . println( thread name= thread . current thread())。getname()));试试{ thread . sleep(1000);} catch(interrupted exception e){ e . printstacktrace();}//这句话就不打印了,因为主线程(目前唯一的普通线程)已经完成System.out.println(守护线程的状态= thread.currentthread()。等待1秒后的getstate();});//daemon thread . set daemon(true);//Thread starts Thread . start();System.out.println(是否是守护进程= thread . is demon());}

  00-1010执行join()方法的线程进入等待唤醒状态(WAITING),然后从等待唤醒状态变为可运行状态,直到调用该方法的线程.结束join()方法是thread类中的一个方法,它的底层是使用wait()方法实现线程等待,只有当thread isAlive()为false时,

  线程的序列化:一个线程调用另一个线程对象的join()实现线程序列化。

  比如:一道好菜。

  publicclassdemoking { publicstaticvoidmain(String[]ar

  gs) {        Thread mainThread = Thread.currentThread();        // 1.买菜        Thread buyThread = new Thread(new CookingThread(mainThread,"买菜"),"buyThread");        // 2.洗菜        Thread washThread = new Thread(new CookingThread(buyThread,"洗菜"),"washThread");        // 3.切菜        Thread cutThread = new Thread(new CookingThread(washThread,"切菜"),"cutThread");        // 4.炒菜        Thread scrambleThread = new Thread(new CookingThread(cutThread,"炒菜"),"scrambleThread");        // 不受线程启动顺序的影响        scrambleThread.start();        washThread.start();        cutThread.start();        buyThread.start();                // main线程先执行完才可以开始:买菜        System.out.println("开始准备……");    }    public static class CookingThread implements Runnable{        private final Thread thread;        private final String job;        public CookingThread(Thread thread, String job){            this.thread = thread;            this.job = job;        }        @Override        public void run() {            String name = Thread.currentThread().getName()+":";            try {                thread.join();                System.out.println(name + job + "开始");                Thread.sleep(1000);                System.out.println(name + job + "结束");                Thread.sleep(1000); // 偷懒下            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}执行结果:main > buyThread > washThread > cutThread > scrambleThread > 结束

  

开始准备……buyThread:买菜开始buyThread:买菜结束washThread:洗菜开始washThread:洗菜结束cutThread:切菜开始cutThread:切菜结束scrambleThread:炒菜开始scrambleThread:炒菜结束

 

  

 

  

线程优先级

设置当前线程的优先级,线程优先级越高,线程可能获得执行的次数越多,Java线程的优先级用整数表示,优先级的范围为1-10,默认为5。

 

  setPriority(int)方法:设置线程的优先级。

  getPriority方法:获取线程的优先级。

  

public static void main(String[] args) {    Thread thread = new Thread(() -> {        System.out.println("线程1");    });    thread.setPriority(10);    Thread thread1 = new Thread(() -> {        System.out.println("线程2");    });    thread1.setPriority(1);    thread.start();    thread1.start();    System.out.println("线程默认的优先级为=" + Thread.currentThread().getPriority());}

 

  

线程中断

使用interrupt() 方法设置线程中断标志=true,让线程受到阻塞时抛出一个中断信号。如果线程处于阻塞、等待唤醒或超时等待状态(Object.wait, Thread.join和Thread.sleep)时,那么它将接收到一个中断异常(InterruptedException),从而提前被结束该状态。反之,如果线程是处于可运行(RUNNABLE)状态,那么中断标志将没有作用。

 

  案例一:线程中断有效

  

public static void main(String[] args) {    Thread thread = new Thread(() -> {        System.out.println("线程1");        try {            // 闹钟1分钟后响            Thread.sleep(60000);            System.out.println("闹钟响了");        } catch (InterruptedException e) {            // 提前退出超时等待状态            System.out.println("发生异常,提前醒了,闹钟没响手动关了");        }        System.out.println("继续执行该线程的后续程序……");    });    thread.setPriority(1);    thread.start();    thread.interrupt();    System.out.println("main线程将thread 终端状态设置为 "+thread.isInterrupted());}

执行结果:

 

  

main线程将thread 终端状态设置为 true线程1发生异常,提前醒了,闹钟没响手动关了继续执行该线程的后续程序……

 

  

案例二:线程中断无效

 

  

public static void main(String[] args) {    Thread thread1 = new Thread(() -> {        System.out.println("线程" + Thread.currentThread().getName());        while (true) {            System.out.print(Thread.currentThread().getState() + "t");        }    });    thread1.start();    thread1.interrupt();}

执行结果:线程一直打印自己的状态为RUNNABLE。

 

  以上就是详解Java线程中常用操作的详细内容,更多关于Java线程操作的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: