java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...

多线程的实现方式:demo1、demo2

demo1:继承Thread类,重写run()方法

packagethread_test;public class ThreadDemo1 extendsThread {

ThreadDemo1(){

}

ThreadDemo1(String szName){super(szName);

}//重载run函数

public voidrun() {for(int count = 1 , row = 1 ; row < 10 ; row ++ , count ++) {for(int i = 0 ; i < count ; i ++) {

System.out.print("*");

}

System.out.println();

}

}public static voidmain(String[] args) {//线程赛跑

ThreadDemo1 td1 = newThreadDemo1();

ThreadDemo1 td2= newThreadDemo1();

ThreadDemo1 td3= newThreadDemo1();

td1.start();

td2.start();

td3.start();

}

}

demo2:实现runnable接口,实现run()方法

packagethread_test;public class ThreadDemo2 implementsRunnable{public voidrun() {for(int count = 1 , row = 1 ; row < 10 ; row ++ , count ++) {for(int i = 0 ; i < count ; i ++) {

System.out.print("*");

}

System.out.println();

}

}public static voidmain(String[] args) {//存在线程赛跑问题

Runnable rb1 = newThreadDemo2();

Runnable rb2= newThreadDemo2();

Runnable rb3= newThreadDemo2();

Thread td1= newThread(rb1);

Thread td2= newThread(rb2);

Thread td3= newThread(rb3);

td1.start();

td2.start();

td3.start();

}

}

demo3:两种方法解决进程赛跑问题

packagethread_test;//两种方法解决线程赛跑

class ThreadWait extendsThread{publicThreadWait() {

}publicThreadWait(String name) {super(name);

}

@Overridepublic voidrun() {for(int count = 1 , row = 1 ; row < 10 ; row ++ , count ++) {for(int i = 0 ; i < count ; i ++) {

System.out.print("*");

}

System.out.println();

}

}

}public classThreadDemo3{public static voidmain(String[] args) {

ThreadDemo3 td= newThreadDemo3();//td.Method1();

td.Method2();

}public voidMethod1() {

ThreadWait tw1= newThreadWait();

ThreadWait tw2= newThreadWait();

tw1.start();while(tw1.isAlive()) {try{

Thread.sleep(100);

}catch(Exception e){

e.getMessage();

}

}

tw2.start();

}public voidMethod2() {

ThreadWait tw1= newThreadWait();

ThreadWait tw2= newThreadWait();

tw1.start();try{

tw1.join(); // 等待该线程中止

}catch(Exception e){

e.toString();

}

tw2.start();

}

}

线程异步访问数据导致问题:

packagethread_test;//线程异步访问数据导致问题

classShareData{public static String szData = "";

}class ThreadDemo extendsThread{private staticShareData oShare;

ThreadDemo(){

}

ThreadDemo(String name, ShareData oShare){super(name);this.oShare =oShare;

}public voidrun() {for(int i = 0 ; i < 5 ; i ++) {if(this.getName().equals("th1")) {

oShare.szData= "这是第一个进程";try{

Thread.sleep(100);

}catch(Exception e) {

}

System.out.println(this.getName() +oShare.szData);

}else if(this.getName().equals("th2")) {

oShare.szData= "这是第二个进程";try{

Thread.sleep(100);

}catch(Exception e) {

}

System.out.println(this.getName() +oShare.szData);

}

}

}

}public classThreadDemo5 {public static voidmain(String[] args) {

ShareData oShare= newShareData();

ThreadDemo th1= new ThreadDemo("th1", oShare);

ThreadDemo th2= new ThreadDemo("th2", oShare);

th1.start();

th2.start();

}

}

得到的结果并不是我们想要的:

932a35ad3c9faee8fd0b2d3fd21ea4c1.png

解决办法:

通过“锁”解决线程赛跑问题并实现多线程数据同步:

packagethread_test;classShareData0{public static String szData = "";

}class ThreadDemo0 extendsThread{private staticShareData0 oShare;

ThreadDemo0(){

}

ThreadDemo0(String name, ShareData0 oShare){super(name);this.oShare =oShare;

}public voidrun() {//同步快,并指出同步数据oShare

synchronized(oShare){for(int i = 0 ; i < 5 ; i ++) {if(this.getName().equals("th1")) {

oShare.szData= "这是第一个进程";try{

Thread.sleep(100);

}catch(Exception e) {

}

System.out.println(this.getName() +oShare.szData);

}else if(this.getName().equals("th2")) {

oShare.szData= "这是第二个进程";try{

Thread.sleep(100);

}catch(Exception e) {

}

System.out.println(this.getName() +oShare.szData);

}

}

}

}

}public classThreadDemo6 {public static voidmain(String[] args) {

ShareData0 oShare= newShareData0();

ThreadDemo0 th1= new ThreadDemo0("th1", oShare);

ThreadDemo0 th2= new ThreadDemo0("th2", oShare);

th1.start();

th2.start();

}

}

得到结果:

a9eb425497dba038c06f9cf60d358fc2.png

死锁:由于两个线程都在等待对方释放各自拥有的锁的现象称为死锁,这种现象往往是由于相互潜逃的synchronized代码段而造成的,所以少用synchronized嵌套。

下面是一个死锁的例子:

packagethread_test;public class LockedThread extendsThread{private static Object A = newObject();private static Object B = newObject();private static boolean flag = true;public static voidmain(String[] args) {

LockedThread th1= newLockedThread();

LockedThread th2= newLockedThread();

th1.start();

th2.start();

}public voidAccessA() {

flag= false;synchronized(A) {

System.out.println("th1获得了A的锁");try{

Thread.sleep(1000);

}catch(Exception e) {

}

System.out.println("th1还想要B的锁");synchronized(B) {

System.out.println("th1获得了B的锁");

}

}

}public voidAccessB() {

flag= true;synchronized(B) {

System.out.println("th2获得了B的锁");try{

Thread.sleep(1000);

}catch(Exception e) {

}

System.out.println("th2还想要A的锁");synchronized(A) {

System.out.println("th2获得了A的锁");

}

}

}public voidrun(){if(flag) {

AccessA();

}else{

AccessB();

}

}

}

显示结果:

23f6729b946dd780a7cb3c09645e1206.png

程序没有结束 而是停在了这里,这就是死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word2007鼠标不好用

因为我装了 Powerdesigner 12.5&#xff0c;这个 COM 插件和 Word 2007 有冲突&#xff0c;所以导致了上面的问题&#xff0c;只要在 Word 移除这个 Addin 就可以了&#xff1a;左上角office图标——office选项——加载项——管理加载项——转到——去掉Powerdesigner Add-In前…

Axure5.1不能输入中文问题.

不能输入中文问题默认输入法改成“英语&#xff08;美国&#xff09;——美式键盘”。然后再进行切换就可以了。

java 静态线程_Java线程类静态本机void yield()方法(带示例)

线程类静态本机无效 yield()软件包java.lang.Thread.yield()中提供了此方法。yield()方法表示停止当前正在执行的线程&#xff0c;并为其他优先级相同的等待线程提供机会。如果没有等待线程&#xff0c;或者所有等待线程的优先级都较低&#xff0c;则同一线程将继续执行。这种方…

学习资料(不定更新)

w3cschool : http://www.w3school.com.cn/h.asp 菜鸟教程&#xff1a;http://www.runoob.com/ 51CTO: http://www.51cto.com/ angularjs: https://angularjs.org/ Python学习大本营: http://www.pythondoc.com/ http://webpy.org/ 比较好用的图表JS框架&#xff1a; http://www…

PowerDesigner物理数据模型

物理数据模型 name 显示名称code 生成代码中的名称comment 生成代码中备注生成代码中特例&#xff1a;外键名在Integrity——Constraint name主键名Constraint name

struts2-19-合法用户上传文件

一&#xff1a;登录页面 成功&#xff1a;--->upload.jsp 失败&#xff1a;返回错误信息&#xff08;用户名或者密码错误&#xff09; 二&#xff1a;上传文件 登录成功&#xff1a;上传成功 未登录&#xff1a;--->login.jsp错误信息&#xff08;请登录&#xff09; 三…

java 多线程生产者_java-Runnable加锁实现生产者和消费者的多线程问题

//库存函数&#xff0c;保存着库存的信息Storage.javapublic classStorage {//模拟库存public Integer num1;}//生产者函数 product.java/************************************************************Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.FileName: Customer.j…

Axure共享问题

获取共享项目 文件——获取共享项目——\\192.168.0.212\axureshare\HZ下一步——选择本地保存路径 签入签出 A签出——修改——签入——B获新就能看到新的了A签出的时候B不能更改 当A签出时&#xff0c;B无法查看动态面板的每个状态此时可以把面板复制到自己的页面看 修改中可…

maven项目和普通项目转换

转载于:https://www.cnblogs.com/yver/p/6054131.html

.java文件_【转】java文件操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符&#xff0c;删去不要f…

T-SQL 字符串前加 N 是什么意思

比如 select status Nstopped 那么其中的字符串 stopped 前面为什么要加 N 呢&#xff1f;而且我们发现有些地方加 N 与否都没有影响&#xff0c;有些地方又必须加 N。 N 在这里表示 Unicode&#xff0c;就是双字节字符。对于西文字符&#xff0c;用一个字节来存储过足够了&am…

Gradle用户指南(1)-Gradle安装

前置条件 Gradle 需要 Java JDK 或者 JRE&#xff0c;版本是 6 及以上。Gradle 将会装载自己的 Groovy 库&#xff0c;因此&#xff0c;Groovy 不需要被安装。任何存在的 Groovy 安装都会被 Gradle 忽略。 Gradle 使用你 path 中的 JDK,或者&#xff0c;您可以设置 java_home 环…

幻读Java_脏读、幻读、不可重复读和丢失更新

1.脏读 -- 一个事务读取到另外一个事务没有提交的数据事务T1&#xff1a;更新一条数据-->事务T2&#xff1a;读取事务T1更新的记录事务T1&#xff1a;调用commit进行提交此时事务T2读取到的数据是保存在数据库内存中的数据&#xff0c;称为脏数据&#xff0c;这个过程称为脏…

数据库生成文本文件

通过SQLServer配置管理器——功能的外围应用配置器——打开xp_cmdshell xp_cmdshell "cmd /c echo aaaaa>>a.txt"有特殊符号(如换行<>()%|[]等)须加特殊符号前加^ 调试&#xff1a;-------------aa.cmd---------------echo 但有时候加与不加都一样&#…

第十六章:Java内存模型——Java并发编程实战

一、什么是内存模型&#xff0c;为什么要使用它 如果缺少同步&#xff0c;那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序&#xff0c;可以与源代码中的顺序不同处理器采用乱序或并行的方…

二进制包 mysql_二进制包安装MySQL数据库

1.1二进制包安装MySQL数据库1.1.1 安装前准备(规范)[rootMysql_server ~]# mkdir -p /home/zhurui/tools ##创建指定工具包存放路径[rootMysql_server ~]# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.32-linux2.6-x86_64.tar.gz ##下载二进制包[ro…

SELECT TOP n 性能测试

--快1. select top 100 * from test where c1 < 30000 order by c2 --慢2. select top 101 * from test where c1 < 30000 order by c2 1. is more than two times faster than 2. CREATE TABLE [dbo].[NUM]([n] int NOT NULL, s varchar(128) NULL, PRIMARY KEY CLUSTE…

【转】String.format详解

一、前言                            String.format 作为文本处理工具&#xff0c;为我们提供强大而丰富的字符串格式化功能&#xff0c;为了不止步于简单调用 String.format("Hello %s", "John");&#xff0c;下面将笔记整理…

vs2010帮助文件安装完全攻略

1.第一种情况&#xff0c;安装时自动安装了help viewer这个就比较方便了&#xff0c;只需要第一次选择一个合适的位置&#xff0c;将Iso里面的文件安装进来即可&#xff0c;几乎就是傻瓜式的下一步 2.安装s2010时没有安装&#xff0c;之后又使用过帮助文件&#xff0c;这个东西…

java node websocket_nodejs怎么实现webSocket接口即时通讯服务?

websocket工作方式:广播和收听 # 使用场景:金融/聊天室/……websocket:服务器支持广泛(node/java/php/c#……) 原生API操作复杂 可以使用第三方模块:socket.io 是在websocket的基础上创建的模块 优点:简单下载服务器端npm i socket.io客户端使用// 工作方式:事件绑定与事件触发…