----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一:概念:
<p>
进程:进程是操作系统结构的基础;是一次程序的执行;进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它是系统进行资源分配和调度的一个独立单位。
线程:线程是彼此互相独立的、能独立运行的子任务,线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。所谓的多任务是通过周期性地将CPU时间片切换到不同的子任务,从微观上看来,单核的CPU上同时只运行一个子任务,但是从宏观来看,每个子任务似乎是同时连续运行的。</p>
举例说明:这个概念很好理解。例如,我们登上QQ时,调出任务管理器,查看进程。会发现有QQ.exe进程,细心还会发现有QQProtect等等进程。一个应用程序有很多个进程组成,同理每个进程也有很都线程组成。
二:java线程</p>
概念:在java中也有描述线程的类。类中封装了线程的一切信息,如线程在堆上创建、运行、死亡等。在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。下面会详细讲解。
代码实现:</span>
1):通过继承Thread类</strong>
package lq.java.fuxi.day5;
class MyThread extends Thread{
public void run() {
System.out.println ("run......存放要执行的代码....");
}
public static void main (String[] args) {
MyThread tt = new MyThread();
tt.start();
}
}
注意:在java中用Tread类描述线程。只要继承Tread就成为一个线程了,线程要想调用就要调用线程的start()方法,而start方法,底层会调用线程的run方法,所以当我们定义了一个线程,需要线程来执行某些动作时,就将要执行的代码放在run方法里面即可。
2):通过实现java.lang.Runnable接口。
package lq.java.fuxi.day5;
class MyThread implements Runnable {
public void run() {
System.out.println("run......");
}
public static void main(String[] args) {
MyThread tt = new MyThread();
Thread t = new Thread(tt);
t.start();
}
}
注意:实现了Runnable并不代表了是一个线程,还需要通过Thread的一个构造方法来实现。而实现Runnable接口你就要复写run方法。
三:线程的状态:</span>
1、新建状态:线程对象已经创建,还没有在其上调用start()方法。当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(not alive);
2、就绪状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
特点:有执行资格,没执行权
3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。</div>
特点:有执行资格,有执行权</div>
4、阻塞状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。
特点:放弃执行资格,没执行权,需要条件唤醒</div>
5、死亡:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常
图中可以看出:各个状态之间的转换关系。![](https://img-blog.csdn.net/20131122223907203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjU2MjQ0MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
四:线程的调度(常用)</span>
1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。
Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:</span>
static int MAX_PRIORITY 线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY 线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY 分配给线程的默认优先级,取值为5。
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。</span>
2、线程睡眠</strong>:Thread.sleep(long millis)方法,使线程转到阻塞状态。使线程放弃执行资格,当睡眠结束后,就转为就绪(Runnable)状态。</div>
3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法。
4、线程让步</strong>:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。</div>
5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
称为守护线程。即后台线程:指为其他线程提供服务的线程,JVM的垃圾回收线程就是一个后台线程。
6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。
---- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------