目录
1. 程序、进程、线程
程序:为了完成某种功能,使用计算机编程语言完成任务的一组集合。(指一段静态代码)
进程:指正在执行任务的一组程序,即在计算机操作系统中进行分配资源的基本单位
线程:为了降低时空开销,在操作系统中引入线程,线程是系统调度的基本单位。
为什么引入线程的目的?
进程在OS中的进行创建、撤销、切换等操作的时候时空开销较大,为了减少程序在并发执行时所付出的时空开销,使0S具有更好的并发性,提高系统性能和CPU的利用率。
线程和进程之间的关系
- 一个进程拥有多个线程,一个线程属于一个进程,线程不能脱离进程单独运行;
- 进程是计算机OS中进行分配资源的最小单位,而线程是系统调度的基本单位;
- 在进程中的所用线程可以共享该进程的所拥有的内存资源;
- 每一个进程都至少包含一个主线程。(java中使用一个主线程进行启动程序)
2. 创建线程
1. 继承Thread类创建线程
Thread 类 用于创建线程,操作线程的类 创建主线程:继承Thread类
public class Demo extends Thread{
/*
java 中要在线程中执行的任务,写在run()
*/
@Override
public void run(){
for (int i = 0; i < 500; i++) {
System.out.println("ThreadDemo1: " + i);
}
}
}
public class Test {
/*
main 启动java程序的主线程
*/
public static void main(String[] args) {
//在主线程中创建线程,并启动线程
Demo td = new Demo();
//td.run(); 千万切记调用run() 方法启动线程这只是一个普通方法调用,不是启动线程
td.start();//启动线程start0(); private native void start0();
//告诉操作系统开启线程,开始调度
for (int i = 0; i < 500; i++) {
System.out.println("main: " + i);
}
//主线程和Demo1 中的线程交替运行,主要看CPU进行调度
}
}
2. 实现Runnable接口创建线程
public class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("MyThread: " + i);
}
}
}
public class Test {
public static void main(String[] args) {
MyThread myth = new MyThread();
Thread th = new Thread(myth);
th.start();
}
}
两种创建线程的比较:
- 避免继承的局限,一个类可以继承多个接口。
- 适合于资源的共享。
- 增加程序的健壮性。
3. 线程中常用方法
- void start(); 启动线程
- final void setName(String name) 设置线程的名称
- final String getName() 返回线程的名称
- final void setPriority(int newPriority) 设置线程的优先级
- final int getPriority() 返回线程的优先级
- final void join() throws InterruptedException 等待线程终止
- static Thread currentThread() 返回对当前正在执行的线程对象的引用
- static void sleep(long millis) throws InterruptedException 让当前正在执行的线程休眠(暂停执行), 休眠时间由 millis(毫秒)指定
public class MyThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + Thread.currentThread().getPriority());
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()