JAVA多线程入门系列文章(1)

进程:我们可以将一个正在运行的exe程序理解成一个进程。

线程:在进程中独立运行的子任务。

使用线程的好处:可以最大限度的利用CPU的空闲时间来处理其他的任务,CPU在不同的线程之间快速切换,给用户的感受就是多个任务在同时运行,即异步处理,线程被调用的时机是随机的,这样大大提高了CPU的使用效率。

JAVA中实现多线程的方式主要有两种:继承Thread类和实现Runnable接口,其中Thread类也实现了Runnable接口。

这两种方式创建的线程在工作时的性质一样,没有本质的区别,唯一区别是使用Thread类的时候不支持多继承。

问题1:为什么多次执行start()方法,会报IllegalThreadStateException异常?

答:同一个线程不能重复调用start()方法,如果多次调用,会报IllegalThreadStateException()异常。

线程进行交互的时候,有共享和不共享的区分,不共享数据指的是不同的线程分别操作自己独有的数据,不会出现线程安全的问题。共享数据指的是多个线程操作同一个数据,这种情况下,会出现脏数据,即出现线程安全问题。

关于线程安全的问题,最简单的处理方式是添加Synchronized关键字,Synchronized关键字可以在任何对象和方法上加锁。

有一点需要注意: println()方法内部是同步的,有Synchronized关键字修饰。

currentThread()方法可以返回代码正在被哪个线程调用的信息。

isAlive()方法是判断当前的线程是否处于活动状态,活动状态指的是判断该线程是否还在执行run()方法,如果run()方法执行完毕,或者被强制死亡,则认为该线程已经死亡,isAlive()方法返回false.

问题2 :Thread.currentThread()和this有什么差异?

getId()方法是取得线程的唯一标识。

停止一个线程:

(1)Thread.stop()方法:最好不要用,不安全,而且已经被弃用。

(2)Thread.interrupt()方法:此方法不会中止一个正在运行的线程,还需要加入一个判断才能完成线程的中止,调用interrupt()方法只是在程序中打了一个停止的标记,并不是真的停止线程。

关于Thread.interrupt()的用法:

怎样判断一个线程的状态是不是停止的----》Thread.java中提供了两种方法:

(1)this.interrupted(): 测试当前线程(main)是否已经中断。 public static boolean interrupted()

(2)this.isInterrupted():测试(Thread)线程是否已经中断。 public  boolean isInterrupted()

interrupted()具有清除状态的功能,所以第二次调用的时候会返回false,isInterrupted()方法没有清除状态的功能。

使用Thread.stop()方式去中止线程,是最暴力的一种方式,会抛出ThreadDeath()异常,释放锁后导致数据出现线程不安全问题,Thread.stop()方式已经被弃用,所以不建议在程序中使用该方式停止线程。

最常用的停止方式有两种,第一种是用interrupt()和return结合的方式去处理,第二种是通过在catch中抛出异常的方式去处理,建议使用后者,因为异常会被扩散出去,得以传播.

 

suspend()和resume()方法:

我们使用suspend()方法暂停线程(挂起),使用resume()方法恢复线程的执行。

但是这两个方法弊端很明显,suspend()在挂起方法的时候,不释放锁,即独占锁,会导致其他线程申请锁的时候申请不到,导致长时间的堵塞,更严重的后果是导致数据不同步,产生脏数据。所以一般情况下最好不要用到这两个方法处理线程。

yield()方法: 作用是放弃当前持有的CPU资源,将CPU资源让给其他的任务去使用,但放弃的时间不确定,有可能刚放弃,马上又申请获取到CPU资源。所以产生的现象就是,某一个线程在执行的过程中,如果使用yield()方法,执行过程中所需要的时间明显会增长。

关于线程的优先级:

在操作系统中,CPU优先执行优先级高的线程任务,用SetPriority()方法来设置线程优先级,Java中,优先级分为1-10级,如果优先级小于1或者大于10,会抛出IllegalArgumentException异常。

优先级具有继承性,规则性和随机性。

(1)继承性指的是假设A线程启动了B线程,则B线程的优先级和A线程相同。

(2)规则性指的是高优先级的线程总是大部分先执行完,但不代表高优先级的线程会全部先执行完。

(3)线程优先级与运行结果的顺序是随机的,相同条件下,优先级高的线程运行的速度快。

 

JAVA中有两种线程:用户线程和守护线程。

守护线程具有陪伴的含义,当进程中不存在非守护线程了,守护线程会自动销毁。

典型的守护线程是垃圾回收线程,是非守护线程的保姆。

待更。。。

你可能感兴趣的:(java)