并发:两个事件在一个时间段内发生,如单片机的单核多线程java
进程调度:得到CPU使用权的线程才能执行,有分时调度和抢占式调度两种多线程
Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("notepad");
ProcessBuilder pb = new ProcessBuilder("notepad"); pb.start();
一种方法是将类声明为 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("好"); }
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(); } }