1. synchronized

If two threads are using the same function( here we use output to print out string) of another instance, if we want to make sure that these two threads are not disturbing each other.
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.

The calling function must be the same one from the same instance!
 Error Example 1:
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.

ANSWER 1:
we can make it possible by letting two threads calling for the
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: 

Since we already know the key point is to make the same Instance be synchronized, so we can make the two threads call fordifferent functions( output1,
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

If the method is a static method, since static method is initialized before Instance, if we still want to synchronize two method, One way is to make both of the two methodstatic synchronized, another way, we can synchronize on the instance's
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

when we have many threads working together, sometimes we need to switch between each other on some condition. such as thread1 work 5 times, then switch to thread 2 to run 10 times, then switch back to thread1 to run 5 times. On this condition, we need
to design the logic, so that the thread knowns when to run, and when to wait aside and let others to run.
1. The detailed work of thread can be written to different methods into a single Class, and all these method should add Synchronized key word. So that when we Initialize the class, all the threads that want to do such
work, are synchronized on one lock and will wait for their turn.
2. Condition of switching to each other should also be written into this class, so that other classes can be robust. can it's easy to maintain the code latter.
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的更多相关文章

  1. Java Thread系列(五)synchronized

    Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...

  2. multi thread for Java

    I try to do a testing for HashTable Sychronized behavior today. As an Sychronized Object, HashTable ...

  3. 多线程学习三:Thread API,ThreadLocal,synchronized,volatile和Condition

    一.Thread API: setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 首先要了解什么是Thread. ...

  4. java 多线程实现四种方式解析Thread,Runnable,Callable,ServiceExcutor,Synchronized ,ReentrantLock

    1.Thread实现: import java.util.Date; import java.text.SimpleDateFormat; public class MyThread extends ...

  5. Multi account chang login with multi -thread

    void worker_DoWork(object sender, DoWorkEventArgs e) { isBussy = true; if (Common.isChangingAccount) ...

  6. python multi process multi thread

    muti thread: python threading: https://docs.python.org/2/library/threading.html#thread-objects https ...

  7. Individual Project - Word frequency program - Multi Thread And Optimization

    作业说明详见:http://www.cnblogs.com/jiel/p/3978727.html 一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,所以打算先花1天的时间学习C# 2. ...

  8. Makefile 的 prequisite 執行順序 single multi thread

    Makefile 代碼如下: B 需要 A 的 產出, all: A B A B 是 target, case 1: single-thread make -j1 則執行的順序為 A -> B ...

  9. Java Thread 的使用

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别   一.线程的状态 在正式学习 ...

  10. Java并发编程:Thread类的使用

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

随机推荐

  1. white-space中 pre pre-line pre-wrap的区别

    css3为white-space新增了2个非常高冷的值:pre-line与pre-wrap. 现在我们来看一下它们与pre之间的区别呢? pre:会保留空格,但我想它与pre-line/pre-wra ...

  2. (转)Linux 系统性能分析工具图解读(一、二)

    Linux 系统性能分析工具图解读(一.二) 原文:http://oilbeater.com/linux/2014/09/08/linux-performance-tools.html 最近看了 Br ...

  3. Android:Sqlitedatabase学习小结

    今天刚刚学习完Sqlite数据库的基础知识,随即把学到的东西记录下来,以便随后查阅,以下是自己对Sqlite数据库的小结:1.Sqlite简介       Sqlite是一款轻型的数据库,它包含在一个 ...

  4. [實現DDD] 第11章 工廠

    創建過程中須考慮一些重要細節, 否則所創建的聚合將處於不正確的狀態, 使用適當的工廠方法可以確保這一點, 而客戶端只需輸入基本的參數(通常是值對象), 另外, 工廠能更好地表達出通用語言, 使團隊成員 ...

  5. 【VMware】安装不同系统的虚拟机出现开机黑屏的情况

    解决方法一: 1.以管理员身份运行命令提示符(cmd.exe),输入命令 netsh winsock show catalog 按下回车键执行命令(可以看到VMware注册了两个LSP:vSocket ...

  6. UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息

    应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...

  7. WCF寄宿在C#控制台,并用命令行启动

    公司运用wcf比较多,所以自己研究一下寄宿做个笔记,wcf寄宿在控制台有两种方式 第一种,直接在控制台程序内添加wcf服务. 第二种分别添加控制台程序和wcf服务应用程序,前者引用后者,并在app.c ...

  8. java基础--常用函数总结

    java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...

  9. Spring定时器——时间设置规则

    平时经常有一些写Spring定时器的需求,但是每次要设置定时器的时间的时候,老是既不住,到处找别人的博客又各种不爽,所以就自己记录一份吧,顺便整理一下. org.springframework.sch ...

  10. Drupal中hook_theme函数用法

    在开发的时候不免要使用到drupal theme 定义.举个简单的例子: 复制代码 代码如下: <?phpfunction modulename_theme() { //开始定义自己的theme ...