一、并发与并行

  并发:处理器不停的切换有操作的线程。

  并行:多个处理器同时执行有操作线程。

  

二、启动线程

  无论是A,B哪种方式实现多线程,都需要通过Thread.start方法启动线程。

  A、Thread

    自定义类继承Thread

public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {
this.name = name;
} public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
public static void main(String[] args) {
Thread t = new MyThread("A");
t.start(); Thread t1 = new MyThread("B");
t1.start();
}

  B、Runnable

    自定义类实现Runnable接口

public class MyThread implements Runnable{

    private String name;

    public MyThread(String name) {
this.name = name;
} @Override
public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
    public static void main(String[] args) {
Thread t1 = new Thread(new MyThread("A"));
t1.start(); Thread t2 = new Thread(new MyThread("B"));
t2.start();
}

 三、多线程取钱问题

  存在多次取钱,账号余额不减的情况

/**
* ATM对象
*/
public class AtmThread extends Thread { Account account; long amount; public AtmThread(Account account, long amount) {
this.account = account;
this.amount = amount;
} public void run() {
System.out.println();
System.out.println(this.getName()+"开始取钱("+this.amount+")->");
System.out.println(this.getName()+"查询余额("+this.account.balance+")->");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (this.account.balance < this.amount) {
System.out.println("余额不足");
return;
}
this.account.setBalance(this.account.balance-this.amount);
System.out.println(this.getName()+"结束取钱,余额:"+this.account.balance);
}
}
/**
* 账户
*/
public class Account {
/**
* 余额
*/
long balance; public Account(long balance) {
this.balance = balance;
} public long getBalance() {
return balance;
} public void setBalance(long balance) {
this.balance = balance;
}
}
public static void main(String[] args) {
Account account = new Account(1000);
/**
* 取5次钱
*/
for (int i = 0; i < 5; i++) {
new AtmThread(account, 600).start();
}
}
Thread-0开始取钱(600)->
Thread-3开始取钱(600)->
Thread-3查询余额(1000)->
Thread-0查询余额(1000)->
Thread-4开始取钱(600)->
Thread-4查询余额(1000)->
Thread-1开始取钱(600)->
Thread-1查询余额(1000)->
Thread-2开始取钱(600)->
Thread-2查询余额(1000)->
Thread-3结束取钱,余额:400
余额不足
Thread-0结束取钱,余额:400
Thread-1结束取钱,余额:400
余额不足

解决上面问题,使用synchronized关键字。代码修改如下:将账号对象加锁处理。

运行结果:

Thread-0开始取钱(600)->
Thread-0查询余额(1000)->
Thread-0等待中。。。。。。
Thread-0结束取钱,余额:400 Thread-4开始取钱(600)->
Thread-4查询余额(400)->
Thread-4等待中。。。。。。
Thread-4余额不足 Thread-3开始取钱(600)->
Thread-3查询余额(400)->
Thread-3等待中。。。。。。
Thread-3余额不足 Thread-2开始取钱(600)->
Thread-2查询余额(400)->
Thread-2等待中。。。。。。
Thread-2余额不足 Thread-1开始取钱(600)->
Thread-1查询余额(400)->
Thread-1等待中。。。。。。
Thread-1余额不足

 四、wait set线程休息室

  线程执行wait方法后,都会进入到wait set中,直到有notify,notifyAll,interrupt唤醒该线程。

多线程学习(第一天)java语言的线程的更多相关文章

  1. javaSE习题 第一章 JAVA语言概述

    转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...

  2. JAVA语言规范-线程和锁章节之同步、等待和通知

    JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...

  3. 第一章 Java语言概述

    1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...

  4. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  5. java 学习笔记1 java语言概述及开发环境

    高级语言运行机制 高级语言按程序的执行方式分为编译型和解释型两种. java语言比较特殊,Java程序的执行必须经过先编译后解释的步骤. 1 编译生成字节码,只面向JVM(.class) 2Jvm执行 ...

  6. 第一天 Java语言概述

    一.什么是软件 软件就是按照特定的顺序把数据和指令组合在一起,能够完成相应功能的程序. 软件分为两种: 系统软件:专门用户运行其他程序的平台.比如Linux.Windows.MAC等 应用软件:完成相 ...

  7. 第一章 Java语言概述1

    1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...

  8. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  9. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  10. 第一章 Java语言概述2

    一.编写第一个Java应用程序 1.下载.安装JDK 官方网址:www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...

随机推荐

  1. DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0

    DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0. 问题解决 ...

  2. python中的上下文管理器以及python内建模块contextlib的contextmanager方法

    上下文管理器 上下文管理器是实现了上下文管理协议的对象,其特有的语法是"with -as".主要用于保存和恢复各种全局状态,关闭文件等,并为try-except-finally提供 ...

  3. .net5的安装部署条件

    1.安装vs2019最新版本 2.安装 .net5最新版本的的Hosting Bundle 下载地址:https://dotnet.microsoft.com/download/dotnet/5.0 ...

  4. Warning: PHP Startup: Unable to load dynamic library

    使用 phpstudy时,一直提示找不到指定的模块,但是在我对应的文件里面是有该模块的 且 php.ini中 对应的语句注释也已打开 我遇见该问题解决方法是:php版本与这个拓展的版本不对应  ,把版 ...

  5. airtest IDE初级教程

    一.简介 AirtestIDE 是一款跨平台的 UI自动化测试编辑器 ,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码. 1. Airtes ...

  6. JavaSE——.replace()方法替换内容

    package com.zhao.stringtest; public class Test5 { //.replace()方法替换词汇 public static void main(String[ ...

  7. 查询redis路径,清除redis缓存

    查询redis路径 1.执行ps -ef | grep redis 命令,结果如下(记住PID) 2.执行ps -u 系统用户名,进一步确定进程id, 我这里的系统用户名是root,执行ps -u r ...

  8. .Net core 基础 创建及Nlog

    一..Net Core 依赖注入 .net core3.1 之前的版本需要手动配置swagger.当前项目.net core5.0版本自动配置完成 跨域配置 1.下载依赖包 2.           ...

  9. vmhost永久免费主机搭建wordpress

    vmhost主机试用+worpress搭建 点击vmhost进入vmhost官网,vmhost提供了永久免费的主机,还附带一个三级域名,并且支自定义子域名,免费托管5G的网页空间,网页支持php语言, ...

  10. ES6-moudle

    一.基础认知 结合案例体验module: 前面模拟模块是用立即执行的匿名函数,需要把某些通过window暴露出去,所以还是不能消除全局变量 module模块系统需要服务器环境才能正常执行,在html文 ...