Java 中传统多线程
@
Java 中传统多线程
线程初识
线程的概念
当代操作系统中,可以独立并发执行的基本单元
轻量:占用系统资源极少
独立:操作系统可以独立调度和分派的基本单元
共享:共享进程中的资源
实现线程
继承Thread类,重写run方法
实现Runnable接口,实现run方法
package com.xc.test.threadtest;
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
Thread threadA = new ThreadA();
threadA.setName("ThreadA");
threadA.start();
ThreadB threadB = new ThreadB();
Thread thread = new Thread(threadB);
thread.start();
while (true) {
Thread.sleep(1000);
System.out.println(3);
}
}
}
class ThreadA extends Thread {
public void run() {
while (true) {
System.out.println(this.getName() + ":" + 2);
}
}
}
class ThreadB implements Runnable {
public void run() {
while (true) {
System.out.println(4);
}
}
}
线程的生命周期
新建:线程刚刚创建完毕
可运行:启动线程后
运行:操作系统调度
阻塞/等待:等待某种资源或时间片到
消亡:退出run方法
常用API
类方法:针对当前运行线程
currentThread:获取当前运行线程的引用
yield:使得当前运行线程放弃当前时间片
sleep:使得当前运行线程休眠多少时间(单位是毫秒)
实例方法:针对指定线程
start:启动线程
setP:设置/获取线程优先级
setName/getName:设置/获取线程名称
setD:设置/获取线程的幽灵状态
线程同步
多线程共享数据的问题
多个线程并发访问同一个数据时,容易发生数据状态不稳定
使用锁机制完成线程同步(同-协同,步-调用顺序)
package com.xc.test.threadtest;
public class SysDemo {
public static void main(String[] args) {
Data data = new Data();
new ThreadC(data).start();
new ThreadC(data).start();
}
}
class Data {
int i;
public void process() {
System.out.println("Before:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
System.out.println("After:" + i);
}
}
class ThreadC extends Thread {
Data data;
public ThreadC(Data data) {
this.data = data;
}
public void run() {
super.run();
while (true) {
data.process();
}
}
}
Before:0
Before:0
After:1
After:2
Before:2
Before:2
After:3
Before:4
After:4
线程同步及实现机制
每个类一把锁,每个对象一把锁
只有获取锁的线程可以进入同步区域
class Data {
int i;
public void process() {
synchronized (this) {//对象锁(任意对象),同步块
System.out.println("Before:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
i++;
System.out.println("After:" + i);
}
}
}
class Data {
int i;
public synchronized void process() {//对象锁(当前对象),同步方法
System.out.println("Before:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
i++;
System.out.println("After:" + i);
}
}
Before:0
After:1
Before:1
After:2
Before:2
After:3
Before:3
After:4
线程间通讯
线程间通讯模型
wait:使当前线程进入指定对象的等待池
notify:从指定对象等待池中唤醒一个等待线程
notifyAll:从指定对象等待池中唤醒全部等待线程
只有获得该对象的锁后才可以调用上述方法
线程中通讯的实现
生产者:synchronized(obj){...;obj.notifyAll()}
消费者:synchronized(obj){obj.wait(),...;}
package com.xc.test.threadtest;
public class WnDemo {
public static void main(String[] args) {
Data2 data2 = new Data2();
new Producer(data2).start();
new Consumer(data2).start();
}
}
class Data2 {
int i;
public void add() {
synchronized (this) {
i++;
if (i % 5 == 0) {
notifyAll();
}
}
}
public void sub() {
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
System.out.println("Before:" + i);
i++;
System.out.println("After:" + i);
}
}
class Consumer extends Thread {
Data2 data;
public Consumer(Data2 data) {
this.data = data;
}
public void run() {
while (true) {
while (true) {
data.sub();
}
}
}
}
class Producer extends Thread {
Data2 data;
public Producer(Data2 data) {
this.data = data;
}
public void run() {
while (true) {
while (true) {
data.add();
}
}
}
}
Java 中传统多线程的更多相关文章
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- 【转】Java中的多线程学习大总结
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- java中的多线程 // 基础
java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
- Java中使用多线程、curl及代理IP模拟post提交和get訪问
Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
随机推荐
- NLog组件
接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知: 下载 通过Nu ...
- AIDL使用以及原理分析
AIDL使用以及IPC原理分析(进程间通信) 概要 为了大家能够更好的理解android的进程间通信原理,以下将会从以下几个方面讲解跨进程通讯信: 1. 必要了解的概念 2. 为什么要使用aidl进程 ...
- 伺服电机&旋转变压器&光电编码器
旋转变压器与光电编码器是目前伺服领域应用最广的测量传感器. 一.伺服系统 又称为随动系统,精确的跟随或者复现某个过程的反馈系统. 使物体的位置.方位.状态等输出被控量能够跟随目标(设定)的任意变化的自 ...
- Flink监控:Monitoring Apache Flink Applications
This post originally appeared on the Apache Flink blog. It was reproduced here under the Apache Lice ...
- CQOI2019(十二省联考)游记
CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...
- ARTS打卡第四周
Algorithm 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用 ...
- 多种解法解决n皇后问题
多种解法解决n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后,要求每 ...
- jenkins自动化部署vue
一.nodejs配置 首先加入nodejs插件 在配置里面配置这个插件 这样我们就能在自动构建发布的配置里看到nodejs的编译选项了 二.发布配置 首先新建一个自由风格的项目 然后配置构建保留天数和 ...
- Batch Normalization的解释
输入的标准化处理是对图片等输入信息进行标准化处理,使得所有输入的均值为0,方差为1 normalize = T.Normalize([0.485, 0.456, 0.406],[0.229, 0.22 ...
- redis 的过期策略都有哪些?内存淘汰机制都有哪些?
面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...