初学线程的知识要点

 

一、基本概念

1.程序:一系列可执行程序的集合

2.进程Process :简单来说就是一个程序在给定的活动空间和

初始条件,在一个处理机上的执行过程。可以简单的理解为

进程就是一个在运行的程序,它是由一个或多个线程组成。

3.线程 Thread:一个线程是一个程序内部的一个顺序控制流。

即:一个或多个线程组成一个进程。

*进程与线程的关系:

一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己独有的栈空间,但代码区是共享的,即不同的线程可以执行同样的函数。

4.Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。每个 Java 程序都至少有一个线程-主线程。 

主线程的重要性体现在两个方面: 

a.它是产生其他子线程的线程。

b.通常它必须最后完成执行,因为它执行各种关闭动作。

二、线程生命周期

1.新建(New Thread):当一个Thread类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源

2.就绪(Runnable):处于新建状态的线程被启动后,将进入线程队列排队,这个时候具备了运行的条件,一旦轮到CPU的时候,就可以脱离创建它的主线程独立开始自己的生命周期.

3.运行(Running):就绪的线程被调度进入运行状态,每一个Thread类及其子类的对象都有一个重要的run()方法,当线程对象被调度执行的时候,它将自动调用本对象的run()方法,从第一句代码开始执行。所以说对线程的操作应该写到run()方法中

4.阻塞(Not Runnable)(中断):一个正在执行的线程如果再某种情况下不能执行了.进入阻塞状态,这个时候它不能进入排队状态,只有引起了阻塞的原因消失的时候,线程才可以继续进入排队状态等待CUP处理。

5.死亡(Dead):处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原因是正常运行的线程完成了全部工作,即执行完了run()方法,另外就是被提前强制的终止了。

<!--[if !supportLists]-->三、<!--[endif]-->创建线程方法

1、要想创建线程,最简单的办法就是继承java.lang.Thread

要触发一个新线程,使用 start() 方法,

    如:Mythread t = new Mythread();

           t.start();

2、声明一个实现 Runnable 接口的类,并实现 run() 方法。 

    class B implements Runnable{

           public void run( ) {/* 实现该方法*/ }

}

B b = new Thread(new B());

b.start();

3、通过定时任务调用 定义一个定时任务项  (继承TimeTask)

例如:class C extends TimerTask{

public void run(){

}

}

C c = new C();

Timer t = new Timer();

t.schedule(c,1000,2000); 

 

程的通讯

要做到协调多个线程对共享数据的存取这一点,关键是要让线程能相互“协商”。而这个任务要由Object的wait( )和notify( )来完成。这个方法仅在 synchronized 方法中才能被调用。

wait()让把线程挂了起来,notify()和notifyall()激活某个等待线程,其实就是撤销该线程的阻塞状态,从而使他们有机会再次运行

生产/消费 模型:可以使用synchronizedwait( )和notify( )来完成。也可以使用阻塞队列java.util.concurrent.LinkedBlockingDequeput(),take()方法。

 

<!--[if !supportLists]-->五、<!--[endif]-->线程的同步

永远也不会知道线程会在什么时候启动 ,你必须要有办法能防止两个线程同时访问同一个资源。要防止这种冲突很简单,只要在线程运行的时候给资源上锁就行了。第一个访问这个资源的线程给它上锁,在它解锁之前,其它线程都不能访问这个资源,接着另一个线程给这个资源上锁然后再使用,如此循环。由于锁定语句会产生"互斥(mutual exclusion)"的效果,因此这一机制通常也被称为mutex。Java提供了内置的防止资源冲突的解决方案,这就是synchronized关键词。synchronized并不是保护数据不被访问,只是保证同一时刻只有线程在运行有了synchronized,多线程程序才变得可以控制。当一个线程访问对象的一个synchronized同步代码块时,它就获得了该对象的对象锁。结果,其它线程对该对象所有同步代码部分的访问都被暂时阻塞。 

锁的方式:

1、锁住代码块

synchronized(需要同步的对象){

需要同步代码

}

2、锁住方法体

public synchronized void quqian(int n){

}

3、使用锁对象

Lock l =new ReentrantLock;

l.lock();

//同步代码块

l.unlock();

六、线程的暂停和停止模型

static boolean isPause = false;// 是否暂停

boolean isStop = false;// 是否停止

public void run() {

while (!isStop) {

if (!isPause) {

//需要在线程中执行的代码

//...

}

try {

Thread.sleep(10);

} catch (Exception e) {

e.printStackTrace();

}

}

}

 

 

七、线程安全问题

如果对共享数据都是只读操作,则线程安全的。当对共享数据同时进行读写操作如果时采取了同步措施,调用者不需要考虑数据同步问题,则线程安全的。其他情况则不是线程安全的

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值