今天系统学习下JAVA的多线程,之前看过一些,看过也就过去了,还是尽量多记录下,好好总结下。
多线程在较低的层次傻瓜你扩展了多任务的概念:一个程序同时执行多个任务.
进程和线程的区别:本质上每个进程拥有自己的一整套变量,而线程则共享数据。共享变量使线程之间的通信比进程之间更有效、容易。
在一个单独的线程中执行一个任务的简单过程:
1),将任务代码移到实现了Runnable接口的类的run方法中,
public interface Runnable { void run(); }
实现一个类:
Class MyRunnable immplements Runnable { public void run() { //task code } }
2),创建一个类对象
Runnable r = new MyRunnable();
3),由Runnable创建一个Thread对象:
Thread t = new Thread(r);
4).启动线程:
t.start();
public class ThreadTest implements Runnable { public static void main(String[] args){ ThreadTest t1 = new ThreadTest("thread1"); ThreadTest t2 = new ThreadTest("thread2"); Thread demo1 = new Thread(t1); Thread demo2 = new Thread(t2); demo1.start(); demo2.start(); } public ThreadTest(){} public ThreadTest(String name){ this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "running " + i); } } private String name; //field }
另外一种方法是继承Thread类,
example2:
public class ThreadTest extends Thread { public static void main(String[] args){ ThreadTest t = new ThreadTest(); ThreadTest t1 = new ThreadTest(); t.start(); t1.start(); } public void run(){ System.out.println(this.getName()+" Running"); } }
void interrupt() 向线程发送中断请求/
static boolean interrupted()测试当前线程是否被中断/
static Thread currentThread() 返回代表当前执行线程的Thread对象/
要确定一个线程当前状态,可调用getState()方法。
线程的状态:New、 Runnable、Blocked、Waiting、Time waiting、Terminated。
守护线程
t.SetDaemon(true);
守护线程的唯一用途是为其他线程提供服务,例如计时线程。
同步
在大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取,同步存取。
有两种机制防止代码块受并发访问的干扰,synchronized关键字自动提供一个锁以及相应的“条件”,对于大多数需要显式锁的情况是很便利的。
引入ReentrantLock类。
用ReentrantLock保护代码块的基本结构:
myLock.lock(); try { critical section }finally { myLock.unlock(); }//这一结构确保任何时刻只有一个线程进入临界区,一旦一个线程封锁了锁对象,其他任何线程都无法通过lock语句,当其他线程调用lock时,它们blocked。
条件对象conditional variable
通常,线程进入临界区,发现在某一条件满足之后它才能执行。要使用一个条件对象来管理那些已经获得了一个锁,但还不能做有用工作的线程。
newCondition();