线程的基本操作,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。