并发与并行
并发:两个或多个事件在同一时段内发生
并行:两个或多个事件在同一时刻发生(同时发生)
线程(Thread)和进程
进程:一个内存中运行的应用程序.
线程:进程中的一个执行单元,一个进程至少有一个,可以有多个线程
线程之间互不影响
线程调度
- 分时调度:
轮流使用,平均分配每个线程占用CPU的时间 - 抢占式调度:
根据优先级安排,同优先级随机安排,java为抢占式调度,线程优先级可设置
主线程
执行主(main)方法的线程
单线程程序:
只有一个线程,从main开始,从上到下依次执行
创建新线程有两种方法:
①将类声明为Thread的子类,子类重写run方法
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("run: " + i);
}
}
}
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 20; i++) {
System.out.println("main: " + i);
}
}
②声明Runnable接口的类,该类实现run方法
Runnable中无start方法
多线程运行原理
多线程程序内存图解:
一个start方法会开辟一个栈内存,各个栈内存之间互不影响
Thread和Runnable的区别
传递不同的实现类,传递不同的任务
尽量使用Runnable接口方式
匿名内部类开启多线程
父类:
wrong!!!
Yes!!!一定要用start开启线程
//匿名内部类格式
new Thread() {
//重写run方法
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " ");
}
}
}.start();
接口:
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "1212");
}
};
new Thread(r).start();
or简化
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "231");
}
}).start();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。