JAVA多进程入门

概念

并行和并发

  • 并行:物理上的实现,在同一时间点上发生
  • 并发:两个事件在一个时间段内发生,如单片机的单核多线程java

    进程和线程

  • 进程:一个应用程序能够有多个进程,每个进程有一个独立的内存空间
  • 线程:一个进程能够并发运行多个线程,多个线程共享一个内存空间
  • 进程调度:得到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()方法,使用构造器传入名字参数,便可在子类中获取名称ide

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() 获得当前类的对象,从而获取对象的名字ui

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();
    }
}
相关文章
相关标签/搜索