概念

并行和并发

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

进程和线程

  • 进程:一个应用程序可以有多个进程,每一个进程有一个独立的内存空间
  • 线程:一个进程可以并发运行多个线程,多个线程共享一个内存空间
  • 进程调度:获得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();
}
}

JAVA多进程入门的更多相关文章

  1. java多线程入门学习(一)

    java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程.     线程:同一类线程共享代码 ...

  2. 自学 Java 怎么入门

    自学 Java 怎么入门? 595赞同反对,不会显示你的姓名     给你推荐一个写得非常用心的Java基础教程:java-basic | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐 ...

  3. 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

    以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...

  4. Java NIO入门(二):缓冲区内部细节

    Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...

  5. 完成《Java编程入门》初稿

    Java编程入门 现在的运维工程师不但要懂得集合网络.系统管理而且要和开发人员一起调试系统,社会上也需要"复合性"的运维人员,所以需要做运维的也要懂一些开发,知道软件系统接口的调试 ...

  6. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  7. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  8. C功底挑战Java菜鸟入门概念干货(一)

    一.认识Java 1.Java 程序比较特殊,它必须先经过编译,然后再利用解释的方式来运行.  2.Byte-codes 最大的好处是——可越平台运行,可让“一次编写,处处运行”成为可能.  3.使用 ...

  9. C功底挑战Java菜鸟入门概念干货(二)

    (接上篇博文:C功底挑战Java菜鸟入门概念干货(一)) 一.Java面向对象程序设计-类的基本形式 1.“类”是把事物的数据与相关的功能封装在一起,形成的一种特殊结构,用以表达对真实世界的一种抽象概 ...

随机推荐

  1. bzoj1965 [Ahoi2005]洗牌

    Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联 ...

  2. 【luogu P1082 同余方程】 题解

    最近一直在学习数论,讲得很快,害怕落实的不好,所以做一道luogu的同余方程练练手. 关于x的同余方程 ax ≡ 1 mod m 那么x其实就是求a关于m的乘法逆元 ax + my = 1 对于这个不 ...

  3. 网页静态化技术Freemarker

    1.为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息 ...

  4. LinQ 简介

    LinQ是3.0新加的语法.用起来比较方便,我们可以使用较简单的方法来过滤数据和处理数据. 使用场景: 可以看到LINQ使用场景还是很多的.现在写项目基本都会用到. 在出现委托之前,我们来查找对象 在 ...

  5. mobienet, shufflenet

    参考github上各位大神的代码 mobilenet和shufflenet,实现起来感觉还是各种问题. mobilenet目前使用的代码来自这里:https://github.com/BVLC/caf ...

  6. 解决div+img布局下img下端出现空白的bug

    1.将图片转换为块级对象 即设置img为“display:block;”.在本例中添加一组CSS代码:“#sub img {display:block;}”. 2.设置图片的垂直对齐方式 即设置图片的 ...

  7. 小白袍 -- Chapter 1.4.1.1 URL编码的理论解读

    1.4.1.1  URL编码的理论解读 我们在做JavaWeb时避不过GET请求,GET请求和POST请求最大一点不同就在于参数,GET请求的参数会URL中,而POST请求的参数则会在HTTP Hea ...

  8. springboot 整合dubbo 消费模块引入springboot 之后自动注入jdbc 模块导致启动报错问题

    方案一: 排除方法 pom文件直接将数据起步模块内排除数据源自动注入 jdbc jar <!--mybatis-plus 集成 --><!--mybitis--><dep ...

  9. Oracle 序列的创建删除插入

    今天学习的是序列的创建蟹盖和删除插入 创建: create Sequence Seq_name increment by n     ----序列变化的程度,默认为1,可以为负数表示递减 start ...

  10. linux下重新启动oracle

    第一步.以Oracle帐户进入Linux系统 第二步.执行以下命令查看数据库监听器的状况: lsnrctl status 或者查看数据库端口是否被监听(默认1521) netstat -ano | g ...