10.19易科

进程 – 进程是具有一定独立功能的程序(例如QQ.exe),关于某个数据集合上的一次运行活动,
进程是系统进行资源分配和调度的一个独立单位。
线程 – 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的
基本单位;线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数
器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有
自己的栈空间,拥有独立的执行序列。
在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。
多线程的优点
其实多线程从某方面可以等价于多任务,当你有多个任务要处理时,多个任务一起做所消耗的时间肯定
比任务串行起来做,所消耗的时间短;下图可以很好的说明:
单任务运行环境与多任务运行环境比较
在我们现在的系统中,CPU的运行速度是很快的,其中很大的时间消耗是在等硬盘、IO输入、网络等资
源;当多任务时,CPU完全可以在多个任务之间来回切换。使用的花费的时间远远少于所有任务需要消
耗的少。
使用多线程
在Java的JDK包中,已经自带了对多线程技术的支持,可以非常方便地进行多线程的编程。实现多线程
编程的方式主要有两种:
继承Thread类
实现Runnable接口
Thread类的主要源代码:
public class Thread implements Runnable {
public static native Thread currentThread();
public static native void yield();
public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos) throws InterruptedException {
// …
sleep(millis);
}
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
这二种创建线程的方式有什么区别?
这个主要是因为Java类是单继承的,而接口可以支持多继承,使用Thread类的方式创建新线程时,最大
的局限就是不支持多继承。所以具体选择哪种方式来创建线程,就看你是不是需要具体多继承的特性;
其他没有本质的区别。
Thread详解
通过Thread的源代码,我们现在对其主要的的一些方法进行讲解一下
native关键字 – native是与C++联合开发的时候用的!使用native关键字说明这个方法是原生函
数,也就是说这个方法是用C/C++语言实现的,并且被编译成dll相关组件,由java来调用。所以从
上面的Thread类源代码中可以看到,有好多是调用了原生的函数。
构造方法 – Thread有一组构造方法,具体指定了 线程名称(name) 、 线程组(ThreadGroup) 、 接口
类(Runnable) 、 栈大小(stackSize) 等参数 具体如下:
}
public Thread(ThreadGroup group, Runnable target) {
init(group, target, "Thread-" + nextThreadNum(), 0);
}
public synchronized void start() {
// …
start0();
// …
}
private native void start0();
@Deprecated
public final void stop() {
// …
}
public void interrupt() {
// …
}
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
private native boolean isInterrupted(boolean ClearInterrupted);
public final native boolean isAlive();
@Deprecated
public final void suspend() {
checkAccess();
suspend0();
}
@Deprecated
public final void resume() {
checkAccess();
resume0();
}
}
public Thread()
public Thread(Runnable target)
Thread(Runnable target, AccessControlContext acc)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)
isAlive() – 方法isAlive()是判断当前的线程是否处于活动状态。而这个活动状态指的是:线程已经
启动且尚未终止,如 正在运行 , 准备开始运行 的状态,都认为线程是“存活”的。
sleep() – 在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是
指 this.currentThread() 返回的线程。
getId() – 取得线程的唯一标识。每个线程在初始化的过程中都会调用 nextThreadID 方法获取到
一个唯一标识。

标签

评论

this is is footer