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. golang Context for goroutines

    概要 goroutine 的控制 取消控制 超时控制 goroutine 之间的传值 总结 概要 golang 的提供的 channel 机制是基于 CSP(Communicating Sequenc ...

  2. SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean

    分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...

  3. python表白实现代码(可视化与动画版)

    python表白实现代码(可视化与动画版)如何优雅而又高大上地对自己的心爱女神表白了? ? ? 试试python表白的实现方式吧,是动画版的哦,保证可以如你所愿 ! ! !最终的实现效果如下: 具体实 ...

  4. sessionManager配置

    在sessionManager配置的时候,有两个属性, 在这个类中,cacheManager是要注入到sessionDao中的,但要求sessionDao实现CacheManagerAware接口 C ...

  5. 论文阅读:Blink-Fast Connectivity Recovery Entirely in the Data Plane

    1.背景 在网络中,链路故障的发生在所难免,为了降低故障带来的影响,就需要重新路由,将数据传输到合适的链路上.当因为链路故障发生处的不同,也有不同的解决方法. AS(Autonomous System ...

  6. 【capstone/ropgadget】环境配置

    具体环境配置可参考 https://github.com/JonathanSalwan/ROPgadget/tree/master 作者给出的安装方式 但具体配置中出现了问题,如引用时出现如下错误: ...

  7. 挖矿程序minerd入侵分析和解决办法

    现在比特币的价格涨得很高,所以现在有黑客专门制造挖矿木马来诱导网友,从而达到控制电脑上的显卡来挖掘比特币.为什么木马要控制电脑中的显卡呢?因为显卡挖掘虚拟货币比特币的效率远比 CPU 要高.如果你是一 ...

  8. bean的autowire属性及其生命周期

    一:sutowire属性 1.no:默认值,禁用自动装配: 2.byName:根据属性名称自动装配: 3.byType:根据属性类型自动装配: 4.constructor:通过构造方法自动装配,不推荐 ...

  9. Python 日志模块详解

    前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...

  10. 干干净净的grep

    用grep -rn "xxxx" ./   搜索. 有时候出现大量的 错误信息 主要有 1.Is a directory 2.no such file or directory 前 ...