Java7并发编程指南(学习笔记)

1.进程和线程

现代所有的操作系统都允许并发地执行任务。你可以在听音乐和浏览网页新闻的同时阅读邮件。我们说这种并发是进程级别的并发。而且在同一进程内,也会同时有多种任务。这些在同一进程内运行的并发任务称之为线程。

2..并行性和并发性

当在一个单核处理器上使用多个线程执行应用程序时,很明显的,在程序执行的同时你就会明白这是并发性。当你使用多个线程多核处理器或者多处理器的计算机上执行应用时,便是并行性。还有人这样认为:当使用没有预定顺序的多线程执行应用程序时,它是并发性。而当使用多种按照顺序来执行的线程来简化一个问题的解决方案时,它是并行性。

3.线程的创建和运行

  • 通过直接继承thread类,然后覆盖run()方法。
  • 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数

案例:创建10个线程,每个线程都能计算和输出1-10以内的乘法

4.守护线程和非守护线程

  • 守护线程:和主线程一起结束的线程,叫守护线程。
  • 非守护线程:主线程的结束不影响线程的执行的线程,也叫用户线程。

调用t.setDaemon(true)方法将非守护线程变为守护线程。

主线程的正常结束并不会影响子线程t的执行,子线程t继续执行。 

主线程结束后,设置为守护线程的子线程将不再执行。因为是守护线程,根据主线程一起结束。

注意点

当调用Thread对象的start()方法时, 我们创建了另一个执行线程。在这些start()方法调出后,我们的程序就有了多个执行线程。

当全部的线程执行结束时(更具体点,所有非守护线程结束时),Java程序就结束了。如果初始线程(执行main()方法的主线程)运行结束,其他的线程还是会继续执行直到执行完成。

创建一个Thread类的对象不会创建新的执行线程。同样,调用实现Runnable接口的 run()方法也不会创建一个新的执行线程。只有调用start()方法才能创建一个新的执行线程。

5.获取和设置线程信息

Thread类的对象中保存了一些属性信息能够帮助我们来辨别每一个线程,知道它的状态,调整控制其优先级。 这些属性是:

  • ID: 每个线程的独特标识。
  • Name: 线程的名称。
  • Priority: 线程对象的优先级。优先级别在1-10之间,1是最低级,10是最高级。不建议改变它们的优先级,但是你想的话也是可以的。
  • Status: 线程的状态。在Java中,线程只能有这6种中的一种状态: new, runnable, blocked, waiting, time waiting, 或 terminated.

如果你没有声明一个线程的名字,那么JVM会自动命名它为:Thread-XX,XX是一个数字。线程的ID或者状态是不可修改的。Thread类没有实现setId()和setStatus()方法来允许修改它们。

可以实现Runnable接口来访问这些信息。你可以用Thread类的静态方法currentThread()来访问正在运行的Runnable 对象的 Thread对象。

必须知道 setPriority() 方法会抛出 IllegalArgumentException 异常,如果你设置的优先级不是在1-10之间。

6.中断线程

中断机制的特性是线程需要检查是否被中断,而且还可以决定是否响应结束的请求。所以,线程可以忽略中断请求并且继续运行。

isInterrupted()和interrupted() 方法有着很重要的区别。

第一个不会改变interrupted属性值,但是第二个会设置成false。

interrupted() 方法是一个静态方法,建议使用isInterrupted()方法。

native函数

native是与C++联合开发的时候用的!java自己开发不用的!

使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。

这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。

线程的isInterrupted()就是native修饰的

猜你喜欢

转载自blog.csdn.net/GXQ18010913593/article/details/89028576