一、进程和线程

1、进程:正在运行的程序

        是系统进行资源分配和调用的独立单位

        每一个进程都有它自己的内存空间和系统资源

2、线程是进程中的单个顺序控制流,是一条执行路径

        单线程 即一个控制流,多线程即多个控制流

二、多线程的实现

1、继承Thread实现:

  • 定义一个类继承Thread类

  • 在类中重写run()方法

  • 创建类的对象

  • 启动线程

    代码示例

public class ThreadDemo extends Thread{
@Override
public void run() {
for (int i = 1;i < 20;i++){
System.out.println(getName()+":"+i);
}
} public static void main(String[] args) {
ThreadDemo threadDemo1 = new ThreadDemo();
ThreadDemo threadDemo2 = new ThreadDemo(); threadDemo1.setName("线程1");
threadDemo2.setName("线程2");
System.out.println(threadDemo1.getPriority());
System.out.println(threadDemo2.getPriority());
threadDemo2.setPriority(6);
threadDemo1.start();
threadDemo2.start();
System.out.println(Thread.currentThread().getName());
} }

注意:

  • run方法封装线程执行的代码,直接调用,相当于普通的方法
  • start启动线程,然后由JVM调用此线程的run方法

获取和设置线程名称

利用getName()即可获取到线程的名称,未继承Thread的使用Thread.currentThread().getName()获取线程名称

.setName("")可设置线程名称

线程调度模型

模型分类

1、分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片

    2、抢占调度 优先让优先级高的线程使用CPU,如果线程的优先级相同会随机选择一个

Thread()类中获取和设置优先级的方法

  • 获取优先级public final int getPriority()
  • 设置优先级public final void setPriority(int newPriority)
  • Thread.MIN_PRIORITY 值为1
  • Thread.MAX_PRIORITY 值为10
  • ThreadDemo.NORM_PRIORITY 值为 5
  • 线程优先级高仅仅表示获取CPU时间片的几率高,并不是每次都会优先执行

线程的生命周期

2、实现Runnable:

  • 定义一个类实现Runnable接口
  • 在类1中重写run()方法
  • 创建类1的对象
  • 创建Threa类的对象,把类1对象作为构造方法的参数
  • 启动线程

代码示例

public class RunnableDemo implements Runnable {
@Override
public void run() {
for (int i = 1;i < 100;i++){
System.out.println(i);
}
} public static void main(String[] args) {
RunnableDemo runnableDemo = new RunnableDemo();
Thread thread1 = new Thread(runnableDemo,"线程1");
Thread thread2 = new Thread(runnableDemo,"线程2");
thread1.start();
thread2.start(); }
}

与Threa相比,实现Rnunable的好处:

  • 避免了Java单继承额局限性
  • 适合多个相同程序的代码处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的思维

3、实现 Callable接口(Callable接口有返回值 Runnable接口无返回值),使用ExecutorService、Callable、Future实现有返回结果的多线程

示例代码

public class CallableDemo implements Callable {
//1)重写抽象方法call方法
@Override
public Integer call() throws Exception {
int result = new Random().nextInt(100);
System.out.println("执行子线程完成某次计算,结果为"+result);
return result;
} public static void main(String[] args) throws ExecutionException, InterruptedException {
//2)创建Callable接口实现类对象
CallableDemo callableDemo = new CallableDemo();
//FutureTask实现了RunnableFuture接口,RunnableFuture继承了Runnable接口,FutureTask接口就是Runnable接口的实现类
FutureTask<Integer> task = new FutureTask<>(callableDemo);
Thread thread1 = new Thread(task); //线程池:省去了创建线程、释放线程的时间
//3)开启新的线程
thread1.start();
System.out.println("result="+task.get());
}
}

Java线程基础及多线程的实现的更多相关文章

  1. java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解

    继续学习一下Thread的构造函数,在上次[http://www.cnblogs.com/webor2006/p/7760422.html]已经对如下构造都已经学习过了: 多线程与JVM内存结构的关系 ...

  2. java线程基础巩固---多线程死锁分析,案例介绍

    之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始: 首先新建两个类: 此时当然得到Oth ...

  3. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  4. Java 线程基础

    Java 线程基础

  5. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  6. Java 线程基础知识

    前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...

  7. java 线程基础篇,看这一篇就够了。

    前言: Java三大基础框架:集合,线程,io基本是开发必用,面试必问的核心内容,今天我们讲讲线程. 想要把线程理解透彻,这需要具备很多方面的知识和经验,本篇主要是关于线程基础包括线程状态和常用方法. ...

  8. Java线程基础实例

    概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...

  9. 线程之一:JAVA线程基础

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...

随机推荐

  1. 2.14、制作Centos模板及优化操作

    1.安装系统: (1)规范网卡为eth0的模式: (2)选择时区: (3)选择支持的语言包含中文: (4)选择软件包: 补充:桌面版包选择: (5)关闭down机内存日志: (6)分区: 1)分区说明 ...

  2. 用java实现斐波那契数列

    斐波那契数列源于数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入的计算问题.假设某种兔子兔子,出生第一个月变成大兔子,大兔子再过一个月能生下一对小兔子,且一年 ...

  3. Python调用shell命令常用方法

    Python调用shell指令 方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未 ...

  4. (精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths

    (写题解不容易,来我的博客玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图.(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通 ...

  5. Linux必备命令 - 常用命令集

    默认进入系统,我们会看到这样的字符: [root@localhost ~]#,其中#代表当前是root用户登录,如果是$表示当前为普通用户.cd 命令 cd  /home  :解析:进入/home目录 ...

  6. 深入学习Netty(4)——Netty编程入门

    前言 从学习过BIO.NIO.AIO编程之后,就能很清楚Netty编程的优势,为什么选择Netty,而不是传统的NIO编程.本片博文是Netty的一个入门级别的教程,同时结合时序图与源码分析,以便对N ...

  7. 家庭账本开发day05

    套用layUI模板,成功完成账单的添加,并且能同时对用户的余额进行增加和减少

  8. 结对开发_石家庄地铁查询web系统_psp表

    结对开发_石家庄地铁查询_博客地址:https://www.cnblogs.com/flw0322/p/10680172.html PSP0: PSP0 Personal Software Proce ...

  9. Real DOM和 Virtual DOM 的区别?优缺点?

    一.是什么 Real DOM,真实DOM, 意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实DOM结构,如下: Virtual Dom,本质上是以 JavaScript ...

  10. Python基础之魔术方法(一个序列容器的魔术方法)

    # 创建自己想要的序列容器魔术方法'''__len__():调用len(obj)函数会调用这个魔术方法__getitem__(self,key):在使用下标操作temp['key']以及切片操作的时候 ...