@

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 中传统多线程的更多相关文章

  1. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  2. Java中使用多线程、curl及代理IP模拟post提交和get访问

    Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...

  3. 【转】Java中的多线程学习大总结

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. java中的多线程 // 基础

    java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...

  6. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  7. Java中使用多线程、curl及代理IP模拟post提交和get訪问

    Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...

  8. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  9. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

随机推荐

  1. Markdown 7min快速入门

    目录 概述 宗旨 兼容 特殊字符自动换行 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 代码 图片 其他 表格 删除线 注脚 锚点 反斜杠 自动链接 参考文献 正 ...

  2. vue-cli3 中跨域解决方案

    此方案只能用于开发环境,线上最好设置同源策略(遇到个后端,装你妈批) 前后端不在同一服务器的情况下,前端要访问后端API,可通过在vue.config.js中配置代理服务器. 0:前提条件 1:安装v ...

  3. Java自增和自减操作符——++/--的那些事

    1. 概述 自增操作符(++)和自减操作符(--)是对变量进行加1和减1的操作. 2.分类说明 ++和--是对变量进行自增1和自减1的简写操作符.许多编程任务中经常需要对变量加1或者减1,所以采用这两 ...

  4. flex页面布局练习--知乎

    采用flexbox弹性容器 在手机端进行页面布局 样本地址: http://tpl.zhuamimi.cn/%E6%89%8B%E6%9C%BA%E7%AB%AF%E9%A1%B5%E9%9D%A2- ...

  5. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  6. 仿微信未读RecyclerView平滑滚动定位效果

    效果图有红点的地方表示有未读消息,依次双击首页图标定位,然后定位到某个未读在手动下滑一点距离在次点击定位效果 用过 RecyclerView 的人都知道,自带有几个滚动到item下标的方法,但是不靠谱 ...

  7. Delphi IfThen语句

    function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string; overload; $[StrU ...

  8. Go语言打造以太坊智能合约测试框架(level3)

    传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...

  9. mongodb复制+分片集原理

    ----------------------------------------复制集---------------------------------------- 一.复制集概述: Mongodb ...

  10. Kafka Tuning Recommendations

    Kafka Brokers per Server Recommend 1 Kafka broker per server- Kafka not only disk-intensive but can ...