• 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();
    	}
    }
  • 相关阅读:
    插入排序的算法分析
    SQL的UNION操作
    二分查找的思路
    怎么看吉他简谱
    一句CSS代码杜绝网站iframe挂马
    关于NewFolder.文件夹无法删除的办法
    C#监听USB接入
    C# 系统服务添加安装
    .NET 实现ISAPI过滤器,指定类型文件防下载
    ASP 简单的异或加密方法
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/7300041.html
Copyright © 2020-2023  润新知