首页 > 编程语言 >JAVA---创建线程的4种方式

JAVA---创建线程的4种方式

时间:2022-11-11 22:33:34浏览次数:69  
标签:JAVA name age --- flag 线程 Integer balance public

1.创建线程的4种方式

方式一:

继承Thread,缺点,java是单继承,如果继承了Thread就不能继承其他类

 

 

方式二:

实现runnable()接口,通常不直接在类上实现runnable接口,与类的耦合度高

方式三:实现callable()接口 和futrue使用

与实现runnable接口相比,callable()有返回值,且自带异常处理

方式四:使用线程池

 

 

 

 

2.各种锁的java实现方式

 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!

 

 

 

 

-------------------------------

ThreadDemo类
package com.javasm;

import java.io.Serializable;
import java.util.concurrent.TimeUnit;

public class UserInfo {

final Object object = new Object();
private Integer age;
private String name;
private Integer balance;

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getBalance() {
return balance;
}

public void setBalance(Integer balance) {
this.balance = balance;
}

public UserInfo(Integer age, String name, Integer balance) {
this.age = age;
this.name = name;
this.balance = balance;
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}

protected boolean flag = true;
int count = 0;

public void getMoney() {


while (flag) {
synchronized (this) {
if (balance <= 0) {
System.out.println("余额不足");
flag = false;
return;
}
count++;
balance -= 1000;
System.out.println(Thread.currentThread().getName() + "取走了"+name+"1000元" + "剩余:" + balance + "-" + "第" + count + "次取钱");
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

}

}

public void setMoney() {
balance += 1000;
System.out.println(Thread.currentThread().getName() + "往账户存入1000" + "剩余:" + balance+"元");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}


}
}

--------------------------
UserInfo类
package com.javasm;

import java.io.Serializable;
import java.util.concurrent.TimeUnit;

public class UserInfo {

final Object object = new Object();
private Integer age;
private String name;
private Integer balance;

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getBalance() {
return balance;
}

public void setBalance(Integer balance) {
this.balance = balance;
}

public UserInfo(Integer age, String name, Integer balance) {
this.age = age;
this.name = name;
this.balance = balance;
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}

protected boolean flag = true;
int count = 0;

public void getMoney() {


while (flag) {
synchronized (this) {
if (balance <= 0) {
System.out.println("余额不足");
flag = false;
return;
}
count++;
balance -= 1000;
System.out.println(Thread.currentThread().getName() + "取走了"+name+"1000元" + "剩余:" + balance + "-" + "第" + count + "次取钱");
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

}

}

public void setMoney() {
balance += 1000;
System.out.println(Thread.currentThread().getName() + "往账户存入1000" + "剩余:" + balance+"元");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}


}
}


2.如何解决线程安全问题? 

 




标签:JAVA,name,age,---,flag,线程,Integer,balance,public
From: https://www.cnblogs.com/wang1999an/p/16875293.html

相关文章

  • Ubuntu apt-get彻底卸载软件包
    参考:https://blog.csdn.net/get_set/article/details/51276609如果你关注搜索到这篇文章,那么我可以合理怀疑你被apt-get的几个卸载命令有点搞晕了。apt-get的卸载相关的......
  • JavaScript判断数据类型的几种方式
    一、数据类型JavaScript中数据类型分为两类:基本数据类型undefined、null、string、number、boolean、Symbol引用数据类型Object(Array、Function等)二......
  • day24 - 表格 内联等
    表格​实现表格的创建行操作:tr列操作:td​colspon实现跨列操作rowspon实现跨行操作1<!DOCTYPEhtml>2<htmllang="en"xmlns="http://www.w3.org/1999/html......
  • JavaScript小结
    JavaScript1、什么是JavaScriptJavaScript是一门世界上最流行的语言一个合格的程序员必须精通JavaScript2、快速入门内部标签<script>  这里面写代码</scrip......
  • 2010 Principles on the Security of AES against First and Second-Order Differenti
    一、对于AES算法的DPA攻击准则(无防护措施下的AES实现)(1)在第3轮列混淆前任意中间值可以用于一阶DPA攻击,该攻击将明文的0,3或15比特固定(2)在第7轮轮......
  • 第2-2-2章 常见组件与中台化-常用组件服务介绍-通用权限系统
    目录2.常用组件服务介绍2.1通用权限系统2.1.1.功能概述2.1.2.应用场景2.1.3.重点代码介绍2.1.4.使用说明2.1.4.1新项目开发2.1.4.1.1数据库环境搭建2.1.4.1.2后端......
  • Redis 集群模式的安装与配置【源码安装redis-7.0.5】
    Redis最新版下载地址:http://download.redis.io/releases/redis-7.0.5.tar.gz步骤如下:1)wget http://download.redis.io/releases/redis-7.0.5.tar.gz2)tar-zxf redis-7......
  • Java静态代理设计模式模式(多线程Runnable)
    静态代理设计模式,就是代理对象来帮你忙前忙后,你负责出席一下就好了。需要:1.实现相同的接口2.真实角色3.代理角色,里面有一个成员是接口对象(实际上是真实角色----接口实......
  • SpringMVC-解析@RequestParam参数
    InvocableHandlerMethod.invokeForRequest执行请求时会调用InvocableHandlerMethod.getMethodArgumentValues解析方法参数。InvocableHandlerMethod.getMethodArgumentVal......
  • 【JS】891- 高级 Promise 模式 - Promise缓存
    https://www.jonmellman.com/posts/promise-memoization 译者:ConardLi在本文中,我们将介绍常见的缓存实现在并发条件下存在的问题。然后我们将介绍如何修复它,并且在此过程......