java多线程基础知识(一)

线程之间可以共享访问对象,这种共享访问是多线程最有用的特性之一,也是其最大的陷阱之一。

java.util.concurrent包及其子包提供了较高级别的并发工具。如 Lock包,ReentrantLock包,  下面为Lock类的方法

java多线程基础知识(一)

创建线程有两种方式,一种是继承Thread,一种是实现Runnable接口

Runnable接口就一个方法

java多线程基础知识(一)

区别:

实现Runnable接口相对于继承Thread类来说,有如下显著的好处:

(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

 

为线程命名,只是为了方便程序员,如果没有命名,那么系统运行时会给它起一个名字,通常是Thread – 1,Thread – 2这种简单的数字编号方式。主函数的线程名是main,通过Thread.currentThread().getName() 方法来获取当前运行线程的名字。

MyThread mt = newMyThread();    //通过实现接口生成

Thread t1 = new Thread(mt,"线程一");

Thread t2 = new Thread(mt,"线程二");

Thread类的构造函数如下,其中有5个允许我们指定Runnable对象

java多线程基础知识(一)

new Thread(mt,"线程一").start()。这条语句,我们虽然没有保持对线程的引用,但是在线程被 创建的时候,它将一个对其自身的应用保存到了它所处的ThreadGroup中,所有线程并不会被垃圾回收器收回。

在run方法中定义的工作通常具有明显的私有性,即该工作只能由指定完成该工作的工作者(线程)来执行。

临界区保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 

多线程协作时遵循的协议:在某些动作操作对象之前,必须先获取这个对象的锁。获取操作对象上的锁可以阻止其他对象获取这个锁,直至这个锁的持有者释放它为止。这样多线程就不会同时执行那些会相互干扰的动作。

每个对象都有与之关联的锁,并且可以通过使用synchronized方法和语句来获取或者释放这个锁。

术语   同步代码(synchronized code):指的是包含在synchronized方法或语句中的代码。