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类之前,先介绍与线程相关知 ...
随机推荐
- zookeeper+dubbo简单部署方案
1.zookeeper服务 首先,我们需要下载:zookeeper-3.4.9 解压后,在conf文件夹中添加一个配置文件zoo.cfg,内容如下: tickTime=2000 dataDir=/Us ...
- Java中forEach, 用来遍历数组
这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...
- linux下为.net core应用创建守护进程
1.Supervisor 安装 yum install python-setuptools easy_install supervisor 2.配置 Supervisor mkdir /etc/sup ...
- Nginx的各种报错总结
1.Nginx安装过程报错 错误一:软件依赖包未正确安装问题---PCRE依赖包没有安装 ./configure: error: the HTTP rewrite module requires th ...
- c# 判断是否是DICOM文件
public bool isDicom(string filename) { FileStream fs = File.OpenRead(filename); ]; fs.Read(data, , d ...
- MVC Request.UrlReferrer为null
使用情景,登录后返回登录前访问的页面. 这个时候用到了UrlReferrer var returnUrl = HttpContext.Current.Request.UrlReferrer != nu ...
- python发送邮件(带附件)
python通过stmp发送qq邮件,带附件 import smtplib from email.mime.multipart import MIMEMultipart from email.mime ...
- 从零开始的全栈工程师——利用CSS3画一个正方体 ( css3 )
transform属性 CSS3的变形(transform)属性让元素在一个坐标系统中变形.transform属性的基本语法如下: transform:none | <transform-fun ...
- 【数据库】5.0 MySQL入门学习(五)——MySQL源码了解及MySQL初始化设置
1.0 MySQL源码目录主要包括:客户端代码.服务端代码.测试工具.其他库文件.当然,看懂源代码得有一定的C语言基础. BUILD:各种平台的编译脚本,可以用来制作各平台的二进制版本 client: ...
- android Viewpager取消预加载及Fragment方法的学习
1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载.通过设置setOffscreenPageLimit(int numbe ...