并发concurrent---1
背景:并发知识是一个程序员段位升级的体现,同样也是进入BAT的必经之路,有必要把并发知识重新梳理一遍。
并发concurrent:
说到并发concurrent,肯定首先想到了线程,创建线程有两种方法:1、从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;2、实现Runnalbe接口,重载Runnalbe接口中的run()方法;建议使用方法二创建线程,因为,如果是通过扩展 Thread类的方法来创建线程,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能;而实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性,也更符合面向对象编程的思想,最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享。
创建线程的两种方法:
package www.concurent.test;
public class TraditionalThread { public static void main(String[] args) {
//Thread1:
Thread thread = new Thread() {
@Override
public void run() {
while(true) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1: "+Thread.currentThread().getName());
}
}
};
thread.start(); //Thread2:
//Runnable变量是线程要运行的代码的宿主,更适合面向对象思想的线程方法
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2: "+Thread.currentThread().getName());
}
}
});
thread2.start();
}
}
线程和Timer定时器很类似,下面介绍了两种和线程相似的定时器写法:1、定时一天之后调用方法查询天气情况接口,然后每隔60秒后继续调用该方法;2、定时每天00:39:32调用查询天气情况接口,通过Hutool工具和Timer定时器调用HTTP天气状况接口的返回结果如下截图:(result2得到了天津的天气状况)
通过Hutool工具和Timer定时器调用HTTP天气状况接口:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import cn.hutool.http.HttpUtil; public class TraditionalTimerTest {
//时间间隔
private static final long PERIOD_DAY = * * * ;
//Timer 定时器
public static void main(String[] args) {
Calendar cl = Calendar.getInstance();
cl.set(Calendar.HOUR_OF_DAY, );
cl.set(Calendar.MINUTE, 3);
cl.set(Calendar.SECOND, );
Date date = cl.getTime();
Date dateNow = new Date();
//如果第一次执行定时任务的时间 小于 当前的时间
//此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(dateNow)) {
Calendar clAdd = Calendar.getInstance();
clAdd.setTime(dateNow);
clAdd.add(Calendar.DAY_OF_MONTH, );
date = clAdd.getTime();
}
//Timer1:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello");
//Hutool调用http接口
String result1 = HttpUtil.get("http://t.weather.sojson.com/api/weather/city/101030100");
System.out.println("result1: "+result1);
}
//一天之后调用方法查询天气情况接口,然后每隔60秒后继续调用该方法
},PERIOD_DAY , *);
//Timer2:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//Hutool调用http接口
String result2 = HttpUtil.get("http://t.weather.sojson.com/api/weather/city/101030100");
System.out.println("result2: " + result2);
}
//定时每天00:39:32调用查询天气情况接口
}, date , PERIOD_DAY);
} }
如果是单个线程调用都还ok,要是有多个线程同时调用那就会出现并发产生;比如有一个方法Output()是经过charAt(i)获取字符串i的字符并且打印再控制台,然后线程A和线程B同时调用Output()方法,此时就会出现线程不安全问题(如银行取钱和转账同时进行),也就是并发;执行结果发现,线程A为执行完毕线程B就开始执行了,为了能后保证当有一个线程来执行某个方法时,其他的线程不能进来执行该方法,实现排他性,可以通过synchronized和ReentrantLock来实现线程同步;二者其实区别不大,synchronized由于是底层JVM实现的互斥,因此效率会高一些,而ReentrantLock的功能则比synchronized更多,比如定时获取某个锁,多个等待条件等,另外synchronized 会让线程阻塞,ReentrantLock会让线程等待,但是从行为效果上来看是一样的;下面有个例子:并发结果如截图显示,理想状态是打印“huawei”或者“isoftstone”,但是由于并发打印出来诸如此类“ishuaweoftstoni”结果。
FYI:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class MyThreadSynchronized {
public static void main(String[] args) {
//要想调用内部类的对象,必须有外部类的实例对象
new MyThreadSynchronized().init(); // 外部类的实例对象
}
public void init() {
final Outputer outputer = new Outputer();
//thread1:
new Thread(new Runnable() {
@Override
public void run() {
while(!false) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output3("huawei");
}
}
}).start(); //thread2:
new Thread(new Runnable() {
@Override
public void run() {
while(!false) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("isoftstone");
}
}
}).start();
}
//当有一个线程来执行某个方法时,其他的线程不能进来执行该方法,排他性、独一无二;
//使用synchronized/lock同步,且线程用的同步锁是同一个同步对象,可用this互斥或方法.class
//synchronized由于是底层JVM实现的互斥,因此效率会高一些
//ReentrantLock的功能则比synchronized更多,比如定时获取某个锁,多个等待条件
//synchronized 会让线程阻塞,ReentrantLock会让线程等待,但是从行为效果上来看是一样的;
class Outputer{
//内部类 静态方法中不能new内部类的实例对象
//synchronized:
public synchronized void output(String name) {
for(int i = ; i<name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();// switch line
} //线程不安全
public void output3(String name) {
for(int i = ; i<name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();// switch line
} //lock:
public void ouputlock(String name) {
Lock lock = new ReentrantLock();
lock.lock(); // 上锁同步
try {
for (int i = ; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();// switch line
} finally {
lock.unlock(); // 解锁
}
} } }
并发concurrent---1的更多相关文章
- Java并发---concurrent包
一.包的结构层次 其中包含了两个子包atomic和locks,另外字concurrent下的阻塞队列以及executor,这些就是concurrent包中的精华.而这些类的实现主要是依赖于volati ...
- 并行parallel和并发concurrent的区别
http://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference Concurr ...
- java 并发 concurrent Executor
Excutor类 Executor 执行提交的对象Runnable任务. ExecutorService 一个Executor ,提供方法来管理终端和方法,可以产生Future为跟踪一个或多个异步任务 ...
- Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...
- iOS 处理多个网络请求的并发的情况
如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...
- 并发concurrent---2
背景:并发知识是一个程序员段位升级的体现,同样也是进入BAT的必经之路,有必要把并发知识重新梳理一遍. 并发concurrent: 使用ThreadLocal可以实现线程范围内共享变量,线程A写入的值 ...
- python多进程并发和多线程并发和协程
为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...
- java并发编程概念
并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其 ...
- 《C#并发编程经典实例》学习笔记-关于并发编程的几个误解
误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用.更方便的并发编程技术,包括异步编程.并行编程.TPL 数据流.响应式编程等. 误解二:只有大型服务器程序才需要考虑并 ...
随机推荐
- 挑子学习笔记:DBSCAN算法的python实现
转载请标明出处:https://www.cnblogs.com/tiaozistudy/p/dbscan_algorithm.html DBSCAN(Density-Based Spatial Clu ...
- Mybatis学习笔记之一(环境搭建和入门案例介绍)
一.Mybatis概述 1.1 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了go ...
- 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析
这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试
其实TCP测试的工具有很多,那BeetleX工具所提供的特点又是什么呢?如果你需数十万的请求或模拟上百万的设备连接,那这个工具相信可以满足你的需要!工具是基于BeetleX的基础功能扩展,支持多IP绑 ...
- HTML 基本语法速查
HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head& ...
- 【Python3爬虫】最新的模拟登录新浪微博教程
一.写在前面 首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了. 然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作 ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- 老司机心得之时间管理"入坑"
长期以来,时间管理一直被认为是自我管理,团队管理,项目管理的既关键又基础的手段,就连笔者本人也一直在崇尚时间管理的理念. 但是这里要讲的,不是什么鬼神方法论.而主要是对长时间以来学习和实践时间管理的一 ...
- Docker Demo on Docker
install docker-machine $ curl -L https://github.com/docker/machine/releases/download/v0.10.0/docker- ...