进程和线程的区别与联系:
1、进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程一般由程序,数据集合和进程控制块三部分组成。进程具有的特征:动态性、并发性、独立性、结构性。
2、线程是程序执行的最小单位。线程上下文切换比进程上下文切换要快得多。
3、进程使用独立的数据空间,而线程共享进程的数据空间。一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。
创建线程有几种不同的方式:
继承Thread类、实现Runnable接口、使用Callable和FutureTask、使用线程池(如用Executor框架)、Spring实现多线程(底层是线程池)、定时器Timer(底层封装了一个TimerThread对象)。
实现Runnable接口这种方式更受欢迎,因为不需要继承Thread类,已经继承或者需要继承别的接口的时候,只能实现接口,Java是不支持多继承的。同时,线程池也是非常高效的,很容易实现和使用。
线程在执行过程中,可以处于下面几种状态:
就绪(Runnable):线程准备运行,不一定立马就能开始执行。
运行中(Running):进程正在执行线程的代码。
等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
睡眠中(Sleeping):线程被强制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待获取锁。
死亡(Dead):线程完成了执行。
start()方法和run()方法的区别:
当程序调用start()方法时,会创建一个新线程,然后执行run()方法。但是如果我们直接调用run()方法,则不会创建新的线程,run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程。
一个线程代码例子:
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo(String name) {
// 初始化操作
threadName = name;
System.out.println("初始化线程名称: " + threadName);
}
public void run() {
// 运行时需要执行的操作
System.out.println("线程正在执行: " + threadName);
System.out.println("线程 " + threadName + " 执行结束.");
}
public void start() {
// 创建线程
System.out.println("开始创建线程: " + threadName);
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
}
public class test {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo("Thread-1");
R1.start();
}
}
网友评论