首页 > 技术文章 > 第二章:线程常用操作方法

djlindex 2019-07-21 18:37 原文

线程的命名与取得()

  多线程的主要操作方法都是在Thread类中定义的。 

  多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到线程就只能够依靠线程的名字来进行操作。所以线程的名字是一个至关重要的概念

自己总结:只要继承了Thread类或实现了Runnable接口,那么这个类的对象就是一个线程对象可以操作Thread类里面的线程方法

通过此时的代码可以发现当使用了“mt,run()”直接在主方法之中调用线程类对象中的run()方法,所获得的线程对象的名字为"main",所以可以得到主方法也是一个线程。疑问:我们的进程在哪里?(看window任务管理器看出来)每当使用java命令执行程序的时候就表示启动了一个jvm的进程,一台电脑上可以同时启动若干个jvm进程。

     在任何的开发中,一个主线程可以创建若干个子线程,创建子线程的目的是可以将--些复杂逻辑或者比较耗时的逻辑交由子线程处理。

    上面程序,主线程main处理整体流程,子线程处理耗时操作

    System.out.println(Thread.currentThread().getName());//打印当前线程的对象的名字

线程休眠(sleep()   与  interrupt()  相对  )

  如果说现在希望某一个线程可以暂缓执行,那么就可以使用休眠的处理,在Thread类中定义的休眠方法如下

在进行休眠的时候有可能会出现中断异常“InteruptedException”,中断异常属于Exception的子类,所以该异常必须处理。

 

每次休眠一秒执行下一次循环,休眠的特点是可以自动实现线程的唤醒,以继续进行后续的处理。但是需要注意的是,如果现在有多个线程对象,那么休眠也是有先后顺序的。

 

  此时将产生五个线程对象,并且这五个线程对象执行的方法体是相同的。此时从程序执行的感觉上来讲,好像若干个线程一起进行了休眠,而后一起唤醒,但是实际上是有差别的。自我理解:上面程序执行结果,看图也就是有5个线程对象,每个对象有10次执行机会,每个机会休眠一次。先是第一个对象执行第一次机会,而后第二个对象执行第一次机会,而后第一个对象执行第二次机会......每个对象虽然在一个循环中,但并不是循环整体执行完了,在轮到第二个线程对象执行,相当于5个循环放在那,每个循环都是从1~10开始跑。

 

线程中断(    interrupt()   )

  在之前发现线程的休眠里面提供有一个中断异常,实际上就证明线程的休眠是可以被打断的,而这种打断肯定是由其它线程完成的,在Thread类里面提供有这种中断执行的处理方法。

 所有正在执行的线程都是可以被中断的,中断线程必须进行异常的处理。

线程强制运行(   join()  与  yield()  相对)

所谓的线程强制执行运行,当满足于某些条件之后,某一个线程对象可以一直独占资源,一直到该线程的程序执行结束。(其实就是让其它线程让路,本线程执行完了其它线程在执行)

 

  在进行线程强制执行的时候一定要获取强制执行线程对象之后才可以执行join()调用

线程礼让(yield())

  线程的礼让指的是现将资源让出去让别的线程限制性。现成的礼让可以使用Thread中提供的方法

 

  礼让执行的时候每一次调用yield()方法都只会礼让一次当前的资源

线程优先级(set Priority()  不明显)

 从理论上来说线程的优先级越高越有可能限制性(越有可能抢占到资源)

在进行优先级定义的时候都是通过int型的数字来完成的,而对于此数字的选择在Thread类里面就定义有3个常量

 

主方法是一个线程,那么主方法的优先级呢?

都是中等优先级,只是优先级高的有可能限制性,而不是绝对先执行

推荐阅读