概述

并发和并行是即相似又有区别:

  • 并行:指两个或多个事件在同一时刻发生;
  • 并发:指两个或多个事件在同一时间段内发生。

进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,一个应用程序可以同时启动多个进程。比如在Windows系统中,一个运行的abc.exe就是一个进程。

那么我们此时就可以处理同时玩游戏和听音乐的问题了,我们可以设计成两个程序,一个专门负责玩游戏,一个专门负责听音乐。

但是问题来了,要是要设计一个植物大战僵尸游戏,我得开N个进程才能完成多个功能,这样的设计显然是不合理的。

更何况大多数操作系统都不需要一个进程访问其他进程的内存空间,也就是说进程之间的通信很不方便。

此时我们得引入“线程”这门技术,来解决这个问题。

线程是指进程中的一个执行任务(控制单元),一个进程可以同时并发运行多个线程,如:多线程下载软件。

一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个执行任务,即多线程。

多进程:操作系统中同时运行的多个程序。

多线程:在同一个进程中同时运行的多个任务。

我们查看Windows环境下的任务管理器:

在操作系统中允许多个任务,每一个任务就是一个进程,每一个进程也可以同时执行多个任务,每一个任务就是线程。

多线程作为一种多任务、并发的工作方式,当然有其存在优势:

  • 进程之前不能共享内存,而线程之间共享内存(堆内存)则很简单。
  • 系统创建进程时需要为该进程重新分配系统资源,创建线程则代价小很多,因此实现多任务并发时,多线程效率更高.
  • Java语言本身内置多线程功能的支持,而不是单纯第作为底层系统的调度方式,从而简化了多线程编程.

用java语言创建进程

import java.io.IOException;
//如何用java语言开启一个进程
public class ProcessDemo {
public static void main(String[] args) throws IOException{
//方式一:使用Runtime的exec方法
Runtime.getRuntime().exec("notepad");
//方式二:使用ProcessBuilder类中的start方法
ProcessBuilder pb = new ProcessBuilder("notepad");
pb.start();
}
}

创建和启动线程

方式一:继承Thread类

  1. 自定义类继承于Thread类,那么该自定义类就是线程类;

2.覆写run方法,将线程运行的代码存放在run中;

3.创建自定义类的对象,即线程对象;

4.调用线程对象的start方法,启动线程。

package thread_create;
//继承方式 创建和启动线程
class MusicThread extends Thread{ //MusicThread是线程子类
public void run() { //子类必须重写run()方法
for(int i = 0 ;i < 50;i++)
{
System.out.println("听音乐"+i);
}
} }
public class ExtendsThreadDemo {
public static void main(String[] args){
for(int i = 0 ;i < 50;i++)
{
System.out.println("玩游戏"+i);
if( i == 10){
MusicThread t = new MusicThread(); //创建线程子类的实例
t.start(); //底层也调用了run(); 启动线程
}
} }
}

方式二:实现Runnable接口

1.自定义类实现Runnable接口;

2.覆写run方法,线程运行的代码存放在run中;

3.通过Thread类创建线程对象,并将实现了Runnable接口的实现类对象作为参数传递给Thread类的构造器。

4.Thread类对象调用start方法,启动线程。

class MusicRunnable implements java.lang.Runnable{         //注意MusicRunnable类不是线程类或者线程子类
public void run() { //接口的实现必须覆盖方法。
for(int i = 0 ;i < 50;i++)
{
System.out.println("听音乐"+i);
}
}
}
public class ImplementsRunnableDemo {
public static void main(String[] args){
for(int i = 0 ;i < 50;i++)
{
System.out.println("玩游戏"+i);
if( i == 10){
Runnable t = new MusicRunnable(); //启动线程必须用线程类对象调用start();
new Thread(t).start(); //类Thread的一个构造器中Thread(Runnable target)分配新的 Thread 对象。
}
}
}
}

对比两种方法(吃苹果比赛)

1、继承Thread类

/**
* 案例:存在50个苹果,现在有请三个童鞋(小A,小B,小C)上台表演吃苹果.
* 因为A,B,C三个人可以同时吃苹果,此时得使用多线程技术来实现这个案例.
*
* 此处程序不合理,ABC每个线程都执行50次,即ABC每个人都吃一次编号50的苹果
*/
class Person extends Thread{
private int num= 50;
Person(String name){
super(name);
}
public void run() {
for(int i = 0;i < 50;i++){
if(num > 0)
System.out.println(super.getName()+"吃了第"+num--+"个苹果");
}
}
}
//使用继承Thread的方式创建线程
public class ExtendsDemo {
public static void main(String[] args){
Person p1 = new Person("A");
p1.start();
Person p2 = new Person("B");
p2.start();
Person p3 = new Person("C");
p3.start();
}
}

2、实现Runnable接口

class Apple implements Runnable{
private int num = 50;
public void run(){
for(int i = 0; i< 50 ;i++){
if(num > 0){
System.out.println(Thread.currentThread().getName()+"吃了第"+num--+"个苹果");
}//Thread.currentThread() 返回对当前正在执行的线程对象的引用。
}
}
}
//使用实现Runnable接口的方式,这种方法可以解决此问题
public class ImplementsDemo {
public static void main(String[] args){
Runnable r = new Apple();
new Thread(r,"A").start();
new Thread(r,"B").start();
new Thread(r,"C").start();
}
}

对比

继承方式:

  • java中类是单继承的,如果继承了Thread,该类就不能再有其他的直接父类
  • 从操作上分析,继承方式更简单,获取线程的名字也简单(操作上,简单)
  • 从多线程共享一个资源上分析,继承方式不能做到

实现方式

  • java中类可以实现接口,此时该类还可以继承其他类,并且可以实现接口(设计上,更优雅)
  • 从操作上分析,实现方式稍微复杂点,获取线程的名字比较复杂,得使用currentThread()获取当前线程的引用。
  • 从多线程共享一个资源上分析,实现方式可以做到

java创建多线程&创建进程的更多相关文章

  1. Java之多线程创建方式

    多线程的由来 我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计?要解决上述问题,咱们得使用多进程或者多线程来解决. 多线程的好处: ...

  2. Java的多线程创建方法

    1. 直接使用Thread来创建 package com.test.tt; public class ThreadEx extends Thread{ private int j; public vo ...

  3. python多线程创建与使用(转)

    原文:http://codingpy.com/article/python-201-a-tutorial-on-threads/ 创建多线程 创建多线程主要有2种方式. 使用threading.Thr ...

  4. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  5. JAVA创建多线程

    首先:线程与进程的区别是什么呢? 进程:正在运行的一个程序称之为一个进程,进程负责了内存空间的划分,从宏观的角度:windows是在同时执行多个程序 从微观的角度看,CPU是在快速的切换要执行的程序. ...

  6. Java多线程开发系列之二:如何创建多线程

    前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...

  7. 黑马程序员——JAVA基础之简述多线程,两种创建多线程的方式

    ------- android培训.java培训.期待与您交流! ---------- 多线程: 进程和线程: 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者 ...

  8. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  9. java学习多线程之创建多线程一

    现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...

随机推荐

  1. 谈一谈最近关闭的Kindle人论坛

    最近Kindle圈子内最大的论坛“Kindle人”关闭了,倒也掀起了一阵小波澜.Kindle人论坛是K友圈子里比较著名的一个“Kindle资源分享论坛”,这么一说其实混了这么久网络,大家都知道这个论坛 ...

  2. zabbix自动化运维学习笔记(服务器配置)

    继上次博主整理的安装后,这次是配置步骤 首先打开zabbix的安装web地址   http://xx.xx.xx.xx/zabbix/setup.php  xx.xx.xx.xx是服务器的IP地址 由 ...

  3. EFCore

    Nuget引用 LinqKit.Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer 然后新建类继承DbConte ...

  4. 第三章 如何使用Burp Suite代理

    Burp Proxy 是Burp Suite以用户驱动测试流程功能的核心,通过代理模式,可以让我们拦截.查看.修改所有在客户端和服务端之间传输的数据. 本章主要讲述以下内容: Burp Proxy基本 ...

  5. Effective C++学习笔记(1)

    最近刚看完Effective C++,记录一下当前几个比较常用的方法. 1.以独立语句将newed对象置入智能指针 智能指针是以对象管理资源,在构造函数中获得资源并在析构函数中释放资源​ 以下调用:​ ...

  6. Using Oracle Database In-Memory with Oracle E-Business Suite

    Database In-Memory is one of a number of options that can be deployed to address Oracle E-Business S ...

  7. Isolation Forest原理总结

    Isolation Forest(以下简称iForest)算法是由南京大学的周志华和澳大利亚莫纳什大学的Fei Tony Liu, Kai Ming Ting等人共同提出,用于挖掘异常数据[Isola ...

  8. Python中面向对象的一些关于私有变量和继承的理解

    成员可见性,变量和方法的可见性.使用“__”开头的变量和方法为私有变量和方法 class Student(): def __init__(self, name, age): # 构造函数 # 初始化变 ...

  9. JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??

    <script type="text/javascript">     var x = 4.23323;//测试的数字     var y = String(x).in ...

  10. HDU 5875 Function (线段树+gcd / 单调栈)

    题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半. ...