------- android培训、java培训、期待与您交流! ----------
在操作系统中,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
程序在启动时,会自动产生一个线程,就是main方法所在的线程。在java中通过run方法来为线程指明所要完成的任务。有两种技术来为线程提供run方法:
1、继承Thread类并重写run方法。
Thread类:是专门用来创建线程和对线程进行操作的类。Thread中定义了许多方法对线程进行操作。
Thread类在缺省情况下run方法什么都不做。可以通过继承Thread类并重写Thread类的run方法实现用户线程。
Thread类中的setDaemon(true)设置一个线程为后台线程,该方法必须在线程启动之前调用,也就是在调用start()方法之前调用。
如果一个进程中只有后台线程在运行,这个进程就会结束。
thread1.join()的作用是把thread1所对应的线程合并到调用thread1.join()的线程中。
yield()方法可以让当前正在运行的线程对象临时暂停,让别的线程运行。
//总体结构如下:
public class MyThread extends Thread//通过继承Thread方法
{
public void run()
{
… …
}
}
MyThread t = new MyThread();
t. start(); //线程的启动
2、通过实现Runnable接口的类进而实现ren方法。
通过建立一个实现了Runnable接口的类,并以它作为线程的目标对象来创建一个线程。
Runnable接口:定义了一个抽象方法run()。定义如下:
1 public interface java.lang.Runnable
2 {
3 public abstract void run();
4 }
1 class MyRunner implements Runnable
2 {
3 public void run()
4 {
5 …
6 }
7 }
8
9 MyRunner r = new MyRunner();
10
11 Thread t = new Thread(r);
12 t.start();
关于成员变量与局部变量:如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成
员变量的改变会影响到另一个线程)。
如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。
停止线程的方式:不能使用Thread类的stop方法来终止线程的执行。一般要设定一个变量,在run 方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程结束。
不能依靠线程的优先级来决定线程的执行顺序。 线程优先级只是得到cpu的时间的多少
synchronized关键字:当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。
Java 中的每个对象都有一个锁(lock)或者叫做监视器(monitor),当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。
如果一个对象有多个synchronized 方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。
如果某个synchronized 方法是static 的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java 中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,
因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。
synchronized块,写法:
synchronized(object)
{
}
表示线程在执行的时候会对object对象上锁。
synchronized 方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的代码是可以被多个线程同时访问到的。
wait与notify方法都是定义在Object类中,而且是final 的,因此会被所有的Java类所继承并且无法重写。这两个方法要求在调用时线程应该已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或块当中。当线程执行了wait方法时,它会释放掉对象的锁。另一个会导致线程暂停的方法就是Thread类的sleep方法,它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。
------- android培训 、 java培训 、期待与您交流! ----------