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,一经查实,立即删除!

相关文章

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

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

maven项目和普通项目转换

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

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

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

第十六章: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…

【转】String.format详解

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

java提高班_2020年最新天码营-Java提高班,资源教程下载

课程名称2020年最新天码营-Java提高班&#xff0c;资源教程下载课程介绍初学者先广在精&#xff0c;关注代码背后的实现&#xff0c;关注内功修炼&#xff0c;了解实现原理和思想&#xff0c;形成自己完整的技术体系&#xff0c;知识成片之后就容易触类旁通&#xff0c;进步的速…

力扣Java解数独_LeetCode 力扣 37. 解数独

题目描述(困难难度)给定一个数独棋盘&#xff0c;输出它的一个解。解法一 回溯法从上到下&#xff0c;从左到右遍历每个空位置。在第一个位置&#xff0c;随便填一个可以填的数字&#xff0c;再在第二个位置填一个可以填的数字&#xff0c;一直执行下去直到最后一个位置。期间如…

MSSQL优化之————探索MSSQL执行计划

原文链接&#xff1a;http://blog.csdn.net/no_mIss/archive/2006/11/09/1374978.aspx 作者&#xff1a;no_mIss QQ:34813284 时间&#xff1a;2006.11.07 23:30:00 环境&#xff1a;win2003 mssql2005 最近总想整理下对MSSQL的一些理解与感悟&#xff0c;却一直没有心思和…

java web的动静分离_Apache结合Tomcat实现动静分离的方法

实验环境Apache和Tomcat均安装在IP地址为192.168.153.136的主机上 主机操作系统为centos7 实验之前关闭防火墙 ,命令&#xff1a; systemctl stop firewalld 关闭seliunx &#xff0c;命令&#xff1a;setenforce 0 实验效果为Apache处理html静态资源&#xff0c;Tomcat处理jsp…

【2016.11.16】HTML学习笔记

先是学习了思维导图的使用方法&#xff0c;然后自学了HTML 下面是自学的笔记 转载于:https://www.cnblogs.com/shan01/p/6071081.html

【2016.11.17】HTML学习笔记第二天

今天是自习 下面是我的自学内容 转载于:https://www.cnblogs.com/shan01/p/6074683.html

php 安装php soap.dll,php_soap.dll下载

php_soap.dll原因说明当你的系统出现&#xff1a;php_soap.dll缺失&#xff0c;php_soap.dll故障&#xff0c;php_soap.dll删除&#xff0c;开机php_soap.dll报错&#xff0c;php_soap.dll源码缺失&#xff0c;无法加载php_soap.dll&#xff0c;计算机丢失php_soap.dll&#xf…

1.0 C++远征:数据的封装

4-1数据的封装 1.如何进行数据封装 ​ 未进行数据的封装&#xff0c;成员变量容易发生数据的泄露&#xff1a; ​ 进行数据的封装&#xff08;这是面向对象的思想&#xff09;&#xff0c;成员变量设为private属性&#xff0c;只能通过set和get方法来赋值和取值&#xff0c;提高…

windows彻底删除php,windows如何删除php

windows如何删除php2020-10-19 07:34:59windows删除php的方法&#xff1a;首先打开windows电脑&#xff1b;然后找到PHP文件夹并选择删除&#xff1b;接着以管理员的身份运行CMD实现MySQL的卸载&#xff1b;最后停止Apache服务并重启电脑即可。推荐&#xff1a;《PHP视频教程》…

杂论-FTP

FTP 一 简单介绍 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不…

CMS收集器

CMS收集周期CMS并非没有暂停&#xff0c;而是用两次短暂停来替代串行标记整理算法的长暂停&#xff0c;它的收集周期是这样&#xff1a;初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) -&g…

matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

原文链接&#xff1a;http://tecdat.cn/?p15508绘制ROC曲线通过Logistic回归进行分类加载样本数据。load fisheriris通过使用与versicolor和virginica物种相对应的度量来定义二元分类问题。pred meas(51:end,1:2);定义二进制响应变量。resp (1:100)>50; % Versicolor 0,…

Xcode8更新约束

Xcode升级之后就会发现约束设置好&#xff0c;想更新一下约束&#xff0c;看看约束是不是刚刚好&#xff0c;习惯性的去点右下角的更新约束的结果却发现没有更新约束的这一项了&#xff0c;好尴尬。 后来发现原来在Xcode8的约束更新换了一个地方&#xff0c;并不是在原来的右下…