@

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. nginx系列12:一致性哈希算法

    前面一节的hash算法存在一个问题,当上游的应用服务器因某一台down掉导致服务器数量发生变化时,会导致大量的请求路由策略失效,一致性哈希算法可以缓解这个问题. 一致性哈希算法 1,hash算法存在的 ...

  2. Java异常实战——OutOfMemoryError

    在Java虚拟机规范描述中,除了程序计数器外,虚拟机内存的其他几个运行区域都有发生 OOM 异常的可能.在这里,用代码验证各个运行时区域存储的内容并讨论该如何进行处理 Java堆溢出 Java 堆用于 ...

  3. 【译】.NET Core 3.0 中的新变化

    .NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...

  4. H5与C3权威指南笔记--transition动画

    translation:过渡 举个栗子:transition: width 1s linear; transition有三个属性,分别是transition-property, transition- ...

  5. Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现

    基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现   by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...

  6. 使用Android服务,实现报警管理器和广播接收器

    介绍 几乎在所有平台上都有很多进程运行背景,它们被称为服务.可能在Android平台中有一些服务可以执行长时间运行的操作,这些操作在处理时不需要用户交互. 在本文中,借助预定义的Android警报服务 ...

  7. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting

    反射型攻击那篇提及到,如何是"数据是否保存在服务器端"来区分,DOM 型 XSS 攻击应该算是 反射型XSS 攻击. DOM 型攻击的特殊之处在于它是利用 JS 的 documen ...

  8. HBase单机模式部署

    1.上传&解压 2.设置环境变量 3.启用&检验 4.编辑hbase-env.sh 5.编辑hbase-site.xml 6.启动hbase 7.验证 8.启动hbase shell

  9. vue 导出xlsx表功能

    详细步骤: 1.需要安装三个依赖: npm install -S file-saver xlsx npm install -D script-loader 两个命令行包含三个依赖. 2.项目中src下 ...

  10. c/c++ 多线程 ubuntu18.04 boost编译与运行的坑

    多线程 boost编译与运行的坑 背景:因为要使用boost里的多线程库,所以遇到了下面的坑. 系统版本:ubuntu18.04 一,安装boost 1,去boost官网下载 boost_1_XX_0 ...