概念
并行和并发
- 并行:物理上的实现,在同一时间点上发生
- 并发:两个事件在一个时间段内发生,如单片机的单核多线程
进程和线程
- 进程:一个应用程序可以有多个进程,每一个进程有一个独立的内存空间
- 线程:一个进程可以并发运行多个线程,多个线程共享一个内存空间
- 进程调度:获得CPU使用权的线程才能执行,有分时调度和抢占式调度两种
创建进程
1.使用 Runtime 类的 exec() 方法
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("notepad");
2.使用 ProcessBuilder 类的 start() 方法
ProcessBuilder pb = new ProcessBuilder("notepad");
pb.start();
创建线程(请记得start)
1.继承实现
一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。
//1.创建线程子类,继承于 Thread 类
//2.覆盖 Thread 类中的 run 方法{改方法中的代码称为线程执行体}
public void run() {
System.out.println("1");
}
public static void main(String[] args) {
//3.在主线程中创建 线程子类对象并启动
new ThreadDemo().start();
System.out.println("好");
}
2.接口实现
class Thread2 implements Runnable {
// 1.创建线程子类,继承于 Thread 类
// 2.覆盖 Thread 类中的 run 方法{改方法中的代码称为线程执行体}
public void run() {
System.out.println("使用接口方法");
}
}
//3.在主线程中创建线程子类对象,把对象作为参数传给Thread类,启动线程
public static void main(String[] args) {
Thread2 p = new Thread2();
new Thread(p).start();
}
匿名内部类
//(实现接口方式)
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();
//(覆盖方式)
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}.start();
两种方法比较和获取名称
继承
继承方式,创建不是数据的实例,num 必须称为全局变量,否则会重复创建堆空间的数据,父类中拥有getname()方法,使用构造器传入名字参数,即可在子类中获取名称
package java_study;
class People extends Thread {
public static int num = 50;
public People(String name) {
super(name);
}
public void run() {
for (int i = 0; i < num; i++) {
System.out.println(super.getName() + "吃了" + num-- + "个苹果");
}
}
}
public class ThreadExtendsApple {
public static void main(String[] args) {
new People("小A").start();
new People("小B").start();
new People("小C").start();
}
}
接口(更常用)
使用Apple封装数据,更加合理科学。使用 Thread 类的静态方法 currentThread() 得到当前类的对象,从而获取对象的名字
package java_study;
class Apple implements Runnable {
public int num = 50;
@Override
public void run() {
for (int i = 0; i < 50; i++) {
String name = Thread.currentThread().getName();
if (num > 0) {
System.out.println(name + "吃了第" + num-- + "个苹果");
}
}
}
}
public class ThreadImplementApple {
public static void main(String[] args) {
Apple a = new Apple();
new Thread(a, "A").start();
new Thread(a, "B").start();
new Thread(a, "C").start();
}
}