线程
-
线程和进程之间的区别:
-
进程:每一进程都有自己独立的代码和数据空间, 进程之间切换开销较大,一个进程包含1~n个线程,进程是资源分配的最小单位
-
线程:同一类的线程共享代码和数据空间, 线程之间切换开销较小,线程是cpu调度的最小单位
-
线程和进程一样都分为5个阶段: 创建 就绪 运行 阻塞 终止
-
多进程: 操作系统能同时运行多个任务(程序)
-
多线程: 同一个程序中有多个顺序流执行(多任务执行就是多线程),提高效率
-
单线程:单任务,单个路径执行,需要排序,效率较低
-
学习多线程的核心掌握知识: 线程的开启方式 线程状态 线程安全
-
线程的创建方式:
-
1.继承Thread类,重写run() start()
-
2.实现Runnable接口,重写run() —推荐
-
3.实现Callable接口,重写call()
public class ThreadDemo01 extends Thread{
@Override
public void run() {
for(int i=1;i<=20;i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("一边陪女朋友...");
}
}
//主线程
public static void main(String[] args) {
//创建一个线程
ThreadDemo01 th = new ThreadDemo01();
//开启线程
th.start(); //等待cpu的调度,时间片同一时刻分配给哪一个线程,哪一个线程就会执行,我们无法控制cpu的调度分配
for(int i=1;i<=20;i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("一边敲代码...");
}
}
}
开启线程的第二种方式
-
1.实现Runnable接口,重写run方法
-
优点:
-
1)避免单继承的局限性
-
2)实现资源共享
public class ThreadDemo02 implements Runnable{
@Override
public void run() {
for(int i=1;i<=20;i++) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("一边吃饭...");
}
}
public static void main(String[] args) {
//1创建线程
Thread th = new Thread(new ThreadDemo02());
//2.开启线程
th.start();
for(int i=1;i<=20;i++) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("一边讲课...");
}
}
}