Multi-Thread 1: how to use synchronized
1. synchronized
public class TraditionalThreadSynchronize {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new TraditionalThreadSynchronize().initial();
}
private void initial(){
final Outputter outputter = new Outputter();
new Thread(new Runnable(){ //this is the first theread
public void run(){
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputter.output("aaaaaaaaaaa"); //the thread want to use outputer print a string.
}
}
}).start();
new Thread(new Runnable(){//thread two
public void run(){
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputter.output("bbbbbbbbbbbbb"); //thread two also want to use the function to print
}
}
}).start();
}
class Outputter{
public void output(String name){
int len = name.length();
for(int i= 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
If code won't escape disturbing each other.
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new outputer.output("bbbbbbbb");
}
}
}).start();
if we use new outputer.output("bbbbbbbbb"), still won't work. since the two threads are calling different function from two different instance.So one thing is clear that we have to add synchronized key word and it should
be added to the same Instance.
same function, of the same Instance so we can change the output function to:
public synchronized void output(String name){
int len = name.length();
for(int i=0;i<len;i++){
<span style="white-space:pre"> </span>System.out.print(name.charAt(i));
}
System.out.println();
}
// Synchronized add to the function is the same as synchronized(this). the Instance is sychronized for this function
ANSWER 2:
and output3), as long as the instance is synchronized(which is also easy to do: both of the two functions should addsynchronized
key word)
public void output(String name){
int len = name.length();
synchronized (this)
{
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void output2(String name){
int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
ANSWER 3: in the case that the function is a static method
class
public void output(String name){
int len = name.length();
synchronized (Outputer.class)
{
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void output2(String name){
int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
2.Threads communicate with each other
to design the logic, so that the thread knowns when to run, and when to wait aside and let others to run.
work, are synchronized on one lock and will wait for their turn.
public class Business {
boolean subFirst = true;
public synchronized void subJob(){
while(!subFirst){
try {
this.wait(); //even though get the lock, if it's not our turn, we should wait and give back the lock.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i=0;i<10;i++){
System.out.println("sub...."+Thread.currentThread().getName()+" is running "+(i+1));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
subFirst = false;
this.notify(); // wake other waitting threads
}
public synchronized void mainjob(){
while(subFirst){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i=0;i<100;i++){
System.out.println("main*****"+Thread.currentThread().getName()+" is running "+(i+1));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
subFirst = true;
this.notify();
}
}
Main class
public class TraditionalThreadCommunication {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TraditionalThreadCommunication t = new TraditionalThreadCommunication();
Business business = new Business();
t.startJob(business,50);
}
public void startJob(final Business business, final int cycles){
new Thread(new Runnable(){ //sub thread run
public void run(){
//the detail logic should all be written into Business class
for(int i=1; i<=cycles;i++)
business.subJob();
}
}).start();
new Thread(new Runnable(){ //main thread run
public void run(){
//the detail logic should be written in business class, so that the
//this class be robust, and can be easily changed in latter maintainance
for(int i=1; i<=cycles;i++)
business.mainjob();
}
}).start();
}
}
Multi-Thread 1: how to use synchronized的更多相关文章
- Java Thread系列(五)synchronized
Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...
- multi thread for Java
I try to do a testing for HashTable Sychronized behavior today. As an Sychronized Object, HashTable ...
- 多线程学习三:Thread API,ThreadLocal,synchronized,volatile和Condition
一.Thread API: setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 首先要了解什么是Thread. ...
- java 多线程实现四种方式解析Thread,Runnable,Callable,ServiceExcutor,Synchronized ,ReentrantLock
1.Thread实现: import java.util.Date; import java.text.SimpleDateFormat; public class MyThread extends ...
- Multi account chang login with multi -thread
void worker_DoWork(object sender, DoWorkEventArgs e) { isBussy = true; if (Common.isChangingAccount) ...
- python multi process multi thread
muti thread: python threading: https://docs.python.org/2/library/threading.html#thread-objects https ...
- Individual Project - Word frequency program - Multi Thread And Optimization
作业说明详见:http://www.cnblogs.com/jiel/p/3978727.html 一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,所以打算先花1天的时间学习C# 2. ...
- Makefile 的 prequisite 執行順序 single multi thread
Makefile 代碼如下: B 需要 A 的 產出, all: A B A B 是 target, case 1: single-thread make -j1 則執行的順序為 A -> B ...
- Java Thread 的使用
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 一.线程的状态 在正式学习 ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
随机推荐
- Win10小娜关闭或删除进程
先来说下我为什么想尽方法关闭win10小娜:我觉得功能并不适用于我,即便不启用Cortana小娜,在Win10进程中也会看到Cortana小娜启动着,耗费了内存.CPU,而且主要的我的磁盘利用率等都居 ...
- Transform 引起的 z-index "失效"
重新学习CSS后的第三天,学习制作阴影的过程中,发现的问题:设置了box-shadow后展现的阴影: 添加transform:rotate(10deg);后的效果: 查看CodePen例子:阴影效果 ...
- Lucene常用类
1.1 IndexWriter: 充当 创造/在索引过程中更新指标的 核心组成部分 1.2 Lucene目录 Directory: 索引的存储位置: 通常是文件的列表: 这些文件被称为索引文件. ...
- oracle 备份恢复篇(二)---rman 增备恢复--不完全恢复
一,环境准备 全备脚本: export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01 export ORACLE_SID=prod expor ...
- python3初探
官方网站:https://www.python.org/ 类库大全:https://pypi.python.org/pypi 基础类库:https://docs.python.org/3/libr ...
- Spring Security怎样不让默认的ProviderManager清除密码等信息
<authentication-manager erase-credentials="false"> ... </authentication-manager&g ...
- URAL ——1249——————【想法题】
Ancient Necropolis Time Limit:5000MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u ...
- ADO.NET教程(2)实现增删查改
声明一个类,在类中实现增删查改的方法 public class AdoNet { //声明连接字符串 public string Sqlstr = "data source={0};data ...
- SpringMVC:系统认识一下maven
网上看了很多springMVC helloworld的教程,非常不满意:首先,maven构建的就很少,再者,绝大部分都是断章取义,让人不明就里.其中有几篇讲的好的,我摘录了一些,自己试着构建了一下项目 ...
- 抽象工厂模式&简单工厂模式
抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...