java 如何编写多线程的代码
线程是干活的
所以线程一定是Thread,或者该线程实现Runnable接口
多线程是竞争关系,所以多个线程竞争同一个资源,也就是同一个对象
所以这个竞争对象放到Thread中
即:
// resources是竞争资源
Resources resources = new Resources();
Thread1 thread1 = new Thread1(resources);
Thread2 thread2 = new Thread2(resources);
thread1.start();
thread2.start();
----------------------------------------------------------------------
class Thread1 implements Runnable {
Resources resources = null;
Thread1(Resources resources) {
this.resources = resources;
}
public void run() {
//这个methodA方法时Resources里面的竞争资源方法
resources.methodA();
}
}
class Thread2 implements Runnable {
Resources resources = null;
Thread2(Resources resources) {
this.resources = resources;
}
public void run() {
//这个methodA方法时Resources里面的竞争资源方法
resources.methodA();
}
}
class Resources {
private int count = 100;
//多线程去干活了,它们争着抢着去执行竞争资源里面的方法,所以这个方法区域需要加锁
public synchronized void methodA() {
if(count > 0) {
count--;
}
}
}
例子:
package Thread; public class MultiThread { public static void main(String[] args) {
//resources就是竞争资源对象
Resources resources = new Resources();
Runnable1 runnable1 = new Runnable1(resources); for(int i = 0; i <100; i++) {
// 这里是创建多线程去执行任务
//多线程是竞争关系,所以多个线程竞争同一个资源,也就是同一个对象
//所以这个竞争对象放到Thread中
new Thread(runnable1,"Thread"+i).start();
}
} } class Resources {
private int count = 100; //多线程去干活了,它们争着抢着去执行竞争资源里面的方法,所以这个方法区域需要加锁
public synchronized void methodA() {
if(count > 0) {
count--;
}
System.out.println(Thread.currentThread().getName() + " " +"count:"+count);
}
} class Runnable1 implements Runnable {
Resources resources = null;
Runnable1(Resources resources) {
this.resources = resources;
} public void run() {
//这个methodA方法时Resources里面的竞争资源方法
resources.methodA();
} }
.....
多线程可以同时访问同个对象的不同方法吗?
例子:
public class Test66 {
public static void main(String[] args) {
A a = new A();
Thread1 thread1 = new Thread1(a);
Thread2 thread2 = new Thread2(a); thread1.start();
thread2.start();
}
} class A{
public synchronized void method1() throws InterruptedException {
System.out.println("进入method1方法睡5秒");
Thread.sleep(5000);
} public synchronized void method2() throws InterruptedException {
System.out.println("进入method1方法睡2秒");
Thread.sleep(2000);
}
} class Thread1 extends Thread {
A a;
public Thread1(A a) {
this.a = a;
} @Override
public void run() {
try {
a.method1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread2 extends Thread {
A a;
public Thread2(A a) {
this.a = a;
} @Override
public void run() {
try {
a.method2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
修改一下 :讲method2的 synchronized 去掉
class A{
public synchronized void method1() throws InterruptedException {
System.out.println("进入method1方法睡5秒");
Thread.sleep(5000);
System.out.println("进入method1结束");
} public void method2() throws InterruptedException {
System.out.println("进入method2方法睡2秒");
Thread.sleep(2000);
System.out.println("进入method2结束");
}
}
因此得出结论:同个对象的两个同步方法不能并发执行,也就是一个线程获取了一个对象的锁之后,对应这个对象的其他同步方法也被锁住,其他线程只能等待。若方法没有被synchronized 修饰,则可以多线程并发执行
java 如何编写多线程的代码的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java 22 - 9 多线程之 代码实现的方式2
多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...
- java 22 - 4 多线程的代码实现的方式1
需求:我们要实现多线程的程序. 如何实现呢? 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. Java是不能直接调用系统功 ...
- Java中编写线程安全代码的原理(Java concurrent in practice的快速要点)
Java concurrent in practice是一本好书,不过太繁冗.本文主要简述第一部分的内容. 多线程 优势 与单线程相比,可以利用多核的能力; 可以方便的建模成一个线程处理一种任务; 与 ...
- java如何编写多线程
1.如何实现多线程 1.1实现Runnable接口,实现run()方法. public class Main4 implements Runnable { public static void mai ...
- 使用java语言编写窗口按钮
使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- Java编写高质量代码改善程序的151个建议
第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
随机推荐
- 微信小程序_(组件)scroll-view可滚动视图
微信小程序scroll-view组件官方文档 传送门 提前准备:使用<view>组件制作五条撑满的横向区域 <!--index.wxml--> Cynical丶Gary < ...
- 用 Docker 搭建 ORACLE 数据库开发环境
用 Docker 搭建 ORACLE 数据库开发环境 需要安装 ORACLE 数据库做开发,直接安装的话因为各类平台的限制,非常复杂,会遇到很多问题. 还好,现在有 Docker 化的部署方式,省去很 ...
- C++入门经典-例7.9-对象数组,批量化生产
1:在数组内容中我们了解到,数组是通过指针分配到的一段额定大小的内容.同样,数组也可以包含对象.声明对象数组的形式如下: box boxArray[5]; box boxArray2[2]={box( ...
- Python 之 subprocess模块
一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python ...
- Appium移动自动化测试(四)之元素定位
做过UI自动化测试的童鞋都会发现, 在上一篇文章中居然没有万能定位方式Xpath. 是滴, 确实没有! ADT自带的uiautomatorviewer里面并没有属性xpath, 如果我们需要的话,还需 ...
- 使用 certbot 自动给 nginx 加上 https
概述 目前,Let's Encrypt 可以算是最好用的 https 证书申请网站了吧.而 certbot 可以算是它的客户端,能够很方便的自动生成 https 证书.我把自己的使用经历记录下来,供以 ...
- php下关于字符串与数组的相互转换的函数
public static function string2array($tags) { return preg_split('/\s*,\s*/',trim($tags),-1, ...
- k8s开启cadvisor http 服务
k8s开启cadvisor http 服务 cadvisor介绍: Google的 cAdvisor 是另一个知名的开源容器监控工具. 只需在宿主机上部署cAdvisor容器,用户就可通过Web界面或 ...
- Java 多线程爬虫及分布式爬虫架构
这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...
- linux下杀进程的方法
http://www.linuxidc.com/Linux/2011-08/40052.htm kill -s 9 2222