java多线程的知识是java程序员都应该掌握的技能,目前我接触的项目上用的不多,花点时间熟悉熟悉。

一、基础知识

  1、什么是进程?

  进程是具有一定独立功能的正在运行过程中的程序,是操作系统进行资源分配的最小单位,有程序、数据、进程控制块组成。进程内部有多个线程,这多个线程会共享资源。 

  2、什么是线程? 

  线程有时称为轻量级进程,是CPU调度的最小单位,依赖于进程存在。线程自己不拥有系统资源,与同属于同一进程下的线程共享系统资源。

  3、什么是并行?

  并行(parallel):同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。

  4、什么是并发?

  并发(concurrency):同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

  

  5、多高并发优缺点?

  优点:充分利用系统资源、加快用户响应时间、程序模块化、异步化;

  缺点:线程共享资源,存在冲突,容易导致死锁。

二、java新启线程的三种方式

  1、继承Thread 类,重写run方法:

class UseThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("[" + Thread.currentThread().getName() + "]已启动!");
}
} public class Test {
public static void main(String[] args){
Thread thread = new UseThread();
thread.setName("继承Thread的线程");
thread.start();
}
}

  2、实现Runable接口,实现run方法(或者内部类的形式)

class UseRunable implements Runnable{
@Override
public void run() {
System.out.println("[" + Thread.currentThread().getName() + "]已启动!");
}
} public class Test {
public static void main(String[] args){
Thread thread = new Thread(new UseRunable());
thread.setName("实现Runable接口的线程");
thread.start();
}
} 
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("哈哈哈哈");
}
});

  3、实现Callable接口,实现call方法

class UseCallable implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("[" + Thread.currentThread().getName() + "]已启动!");
return "12345";
}
} public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask = new FutureTask(new UseCallable());
Thread thread = new Thread(futureTask);
thread.setName("实现Callable接口的线程");
thread.start();
System.out.println("call()方法返回的结果:" + futureTask.get());
}
}

  Runable与Callable的区别:

  1. Runable的执行方法是run(),而Callable的执行方法是call();
  2. Runable没有返回结果,Callable支持泛型方式的返回结果,通过和Futrue/FutureTask配合可以用来获取异步执行的结果(FutureTask实际上实现了Runable接口,本质上是将Callable转换为Runable);
    public class FutureTask<V> implements RunnableFuture<V> {
    ...
    };
    public interface RunnableFuture<V> extends Runnable, Future<V> {
      ...
    }
  3. Callable的call()可以向上抛出异常,而Runable的run()不能抛出异常,异常只能内部消化(因为Runable中的run()声明的抽象方法没有抛出异常);
    @FunctionalInterface
    public interface Runnable {
    public abstract void run();
    } @FunctionalInterface
    public interface Callable<V> {
    V call() throws Exception;
    }

    注: Callable执行返回结果需要通过Future.get()获取,该方法会阻塞主线程直到返回结果,而不调用则不会阻塞。

  正常见到的线程实现方式就是这三种,实际还有第四种!!!

  4、使用线程池

  

public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
int poolSize = 5;
ExecutorService executorService = Executors.newFixedThreadPool(poolSize);
List<Future<String>> futureList = new ArrayList<>();
for (int i=0;i<poolSize;i++){
int finalI = i;
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("[" + finalI + "号线程]已执行!");
return "" + finalI + "号线程";
}
});
futureList.add(future);
} for (Future future : futureList){
System.out.println("返回结果:" + future.get());
}
}
}

  当然,上面线程池的实现方式本质上还是使用的的Callable,当然也可以使用Runable。

  一般是推荐使用Runable的方式,java不能多继承,接口的方式利于扩展。

  

java多线程并发(一)-- 相关基础知识的更多相关文章

  1. Java 多线程(一) 基础知识与概念

    多线程Multi-Thread 基础 线程概念 线程就是程序中单独顺序的流控制. 线程本身不能运行,它只能用于程序中. 说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境. 进程 进程:执 ...

  2. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  3. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  4. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  5. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  6. Java多线程并发08——锁在Java中的应用

    前两篇文章中,为各位带来了,锁的类型及锁在Java中的实现.接下来本文将为各位带来锁在Java中的应用相关知识.关注我的公众号「Java面典」了解更多 Java 相关知识点. 锁在Java中主要应用还 ...

  7. 深入理解mysql之BDB系列(1)---BDB相关基础知识

        深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富   一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1 ...

  8. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  9. Java多线程并发04——合理使用线程池

    在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...

  10. Java多线程并发06——CAS与AQS

    在进行更近一步的了解Java锁的知识之前,我们需要先了解与锁有关的两个概念 CAS 与 AQS.关注我的公众号「Java面典」了解更多 Java 相关知识点. CAS(Compare And Swap ...

随机推荐

  1. [转载]JDK自带的实用工具——native2ascii.exe

    做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,原因是编码方式的不一致.native2ascii是sun java sdk提供的一个工具.用来将别的文本类文件(比如*.txt, ...

  2. 吴裕雄--天生自然JAVA数据库编程:处理大数据对象

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...

  3. vim的几种模式&快捷键

    vim的几种模式&快捷键 2017年01月01日 14:05:24 阅读数:3060 一.vim的模式 基本上vim可以分为三种模式:命令模式,插入模式和底行模式,其实vim有多种模式,我们只 ...

  4. ubuntu18.04窗口截图和选区截图快捷键

    解决方法: 1.点击左下角的系统设置. 2.点击设备. 3.点击键盘,可查看各种截图操作的快捷键.  PS:双击图中的快捷键可以设置新的快捷键.

  5. 宏碁发布两款全A平台笔记本:良心价

    导读 8月3日消息,在全球数码互动娱乐盛会ChinaJoy上,宏碁推出全新两款全A平台笔记本——暗影骑士4 锐龙版酷冷游戏本和蜂鸟Swift3锐龙版金属轻薄本. 此次发布的宏碁暗影骑士4 锐龙版笔记本 ...

  6. MapReduce会自动忽略文件夹下的.开头的文件

    MapReduce会自动忽略文件夹下的.开头的文件,跳过这些文件的处理.

  7. Linux下如何查找sqlnet.ora 和listener.ora 和tnsnames.ora 配置文件的目录

    1.首先切换到oracle 用户下 使用env 查看数据库配置文件信息 2.然后找到LD_LIBRARY_PATH=/home/opt/oracle/product/11.2.0.4/db_1 (配置 ...

  8. web.xml文件中context-param的作用

    转 <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件 ...

  9. 机器阅读理解(看各类QA模型与花式Attention)(转载)

    目录 简介 经典模型概述 Model 1: Attentive Reader and Impatient Reader Attentive Reader Impatient Reader Model ...

  10. tan?

    痰是一种急.慢性气管--支气管炎,咳.痰.喘.炎是下呼吸道感染的常见主征.下呼吸道感染有急性和慢性之分.急性感染主要的是急性气管--支气管炎,是呼吸系统最常见的一种疾病,多由感染.物理化学刺激或过敏引 ...