多线程笔记一
1.并发与并行
并发:多个事件在同一个时间段内交替执行。
并行:指两个或者多个事件在同一时刻发生(同时发生)。
并发与并行.png
2.进程和线程的关系
进程:一个正在内存中运行的程序,每个进程都在内存中有单独的内存空间,一个应用程序可以同时有多个进程,进程是程序的一次执行的过程,是系统运行程序的基本单位,系统运行是一个程序从进程创建到进程消亡的过程。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
3.进程调度方式
概念: 任务在并发执行的时候,每个任务都是交替执行的,而这种交替执行更换的规则就是进程的调度方式
-
分时调度:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
-
抢占式调度:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
-
大部分操作系统都支持多进程并发运行,现在的操作系统几乎都支持同时运行多个程序。。
实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
-
4.线程使用
4.1 Thread类
-
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
-
常用方法:
//常用构造方法 Thread() //分配新的 Thread 对象。 Thread(Runnable target) // 分配新的 Thread 对象。 Thread(Runnable target, String name) // 分配新的 Thread 对象。 Thread(String name) //分配新的 Thread 对象。 //方法 String getName() //返回该线程的名称。 void run()// 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法; 否则,该方法不执行任何操作并返回。 void start() //使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 static Thread currentThread() //返回对当前正在执行的线程对象的引用。4.2 线程创建和使用
线程定义使用.png
方法一:
//Thread的子类
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i <20 ; i++) {
System.out.println(currentThread().getName()+"--->"+i);
}
}
}
//测试类
public class Demo_Thread {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}
方法二:
//Runable实现类
public class RunableImpl implements Runnable{
@Override
public void run() {
for (int i = 0; i <20 ; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}
//测试类
public class Demo_Thread {
public static void main(String[] args) {
RunableImpl runable = new RunableImpl();
new Thread(runable).start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}
//另外的方法
public class Demo_Thread {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <20 ; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}).start();
}
}









网友评论