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()方法,使用构造器传入名字参数,即可在子类中获取名称

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();
	}
}
posted @ 2017-08-07 17:02  岑忠满  阅读(517)  评论(0编辑  收藏  举报