Java tutorial
/* * Copyright 2013 wada811<at.wada811@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.wada811.android.library.demos.concurrent; import java.util.concurrent.TimeUnit; import android.content.Context; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import at.wada811.android.library.demos.R; import at.wada811.utils.LogUtils; import at.wada811.utils.PreferenceUtils; /** * [Java]?????synchronized?? | DevAchieve * http://wada811.blogspot.com/2013/11/java-synchronized-example.html */ public class SynchronizedActivity extends FragmentActivity implements OnClickListener { final SynchronizedActivity self = this; public static final int N = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_synchronized); ((Button) findViewById(R.id.button1)).setText("SyncClassMethodExecute"); ((Button) findViewById(R.id.button1)).setOnClickListener(this); ((Button) findViewById(R.id.button2)).setText("AsyncClassMethodExecute"); ((Button) findViewById(R.id.button2)).setOnClickListener(this); ((Button) findViewById(R.id.button3)).setText("SyncThisInstanceMethodExecute"); ((Button) findViewById(R.id.button3)).setOnClickListener(this); ((Button) findViewById(R.id.button4)).setText("AsyncThisInstanceMethodExecute"); ((Button) findViewById(R.id.button4)).setOnClickListener(this); ((Button) findViewById(R.id.button5)).setText("SyncLockInstanceMethodExecute"); ((Button) findViewById(R.id.button5)).setOnClickListener(this); ((Button) findViewById(R.id.button6)).setText("AsyncLockInstanceMethodExecute"); ((Button) findViewById(R.id.button6)).setOnClickListener(this); ((Button) findViewById(R.id.button7)).setText("SyncMultiClassMethodExecute"); ((Button) findViewById(R.id.button7)).setOnClickListener(this); ((Button) findViewById(R.id.button8)).setText("AsyncMultiClassMethodExecute"); ((Button) findViewById(R.id.button8)).setOnClickListener(this); ((Button) findViewById(R.id.button9)).setText("SyncMultiInstanceMethodExecute"); ((Button) findViewById(R.id.button9)).setOnClickListener(this); ((Button) findViewById(R.id.button10)).setText("AsyncMultiInstanceMethodExecute"); ((Button) findViewById(R.id.button10)).setOnClickListener(this); } @Override public void onClick(View v) { LogUtils.d(); switch (v.getId()) { case R.id.button1: syncClassMethodExecute(); break; case R.id.button2: asyncClassMethodExecute(); break; case R.id.button3: syncThisInstanceMethodExecute(); break; case R.id.button4: asyncThisInstanceMethodExecute(); break; case R.id.button5: syncLockInstanceMethodExecute(); break; case R.id.button6: asyncLockInstanceMethodExecute(); break; case R.id.button7: syncMultiClassMethodExecute(); break; case R.id.button8: asyncMultiClassMethodExecute(); break; case R.id.button9: syncMultiInstanceMethodExecute(); break; case R.id.button10: asyncMultiInstanceMethodExecute(); break; default: break; } LogUtils.d(); } /** * synchronized ????? */ public void syncClassMethodExecute() { LogUtils.d(); PreferenceUtils.putString(this, SyncClassMethodExecutor.KEY, null); new Thread(new SyncClassMethodExecutorRunnable("A")).start(); new Thread(new SyncClassMethodExecutorRunnable("B")).start(); new Thread(new SyncClassMethodExecutorRunnable("C")).start(); } public class SyncClassMethodExecutorRunnable implements Runnable { String threadName; public SyncClassMethodExecutorRunnable(String threadName) { this.threadName = threadName; } @Override public void run() { SyncClassMethodExecutor.execute(self, threadName); } } /** * synchronized ????? */ public static class SyncClassMethodExecutor { public static final String KEY = SyncClassMethodExecutor.class.getSimpleName(); public static final synchronized void execute(Context context, String threadName) { String lastThreadName = PreferenceUtils.getString(context, KEY, null); if (lastThreadName != null) { LogUtils.d(threadName + ": do nothing. " + lastThreadName + " is executed."); } else { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } LogUtils.d(threadName + ": execute"); PreferenceUtils.putString(context, KEY, threadName); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * synchronized ????? */ public void asyncClassMethodExecute() { LogUtils.d(); PreferenceUtils.putString(this, AsyncClassMethodExecutor.KEY, null); new Thread(new AsyncClassMethodExecutorRunnable("A")).start(); new Thread(new AsyncClassMethodExecutorRunnable("B")).start(); new Thread(new AsyncClassMethodExecutorRunnable("C")).start(); } public class AsyncClassMethodExecutorRunnable implements Runnable { String threadName; public AsyncClassMethodExecutorRunnable(String threadName) { this.threadName = threadName; } @Override public void run() { AsyncClassMethodExecutor.execute(self, threadName); } } /** * synchronized ????? */ public static class AsyncClassMethodExecutor { public static final String KEY = AsyncClassMethodExecutor.class.getSimpleName(); public static final void execute(Context context, String threadName) { String lastThreadName = PreferenceUtils.getString(context, KEY, null); if (lastThreadName != null) { LogUtils.d(threadName + ": do nothing. " + lastThreadName + " is executed."); } else { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } LogUtils.d(threadName + ": execute"); PreferenceUtils.putString(context, KEY, threadName); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * synchronized ????? */ public void syncThisInstanceMethodExecute() { LogUtils.d(); SyncThisInstanceMethodExecutor executor = new SyncThisInstanceMethodExecutor(); new Thread(new SyncThisInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new SyncThisInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new SyncThisInstanceMethodExecutorRunnable(executor, "C")).start(); } public class SyncThisInstanceMethodExecutorRunnable implements Runnable { private SyncThisInstanceMethodExecutor mExecutor; private String mThreadNmae; public SyncThisInstanceMethodExecutorRunnable(SyncThisInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute(mThreadNmae); } } /** * synchronized ????? */ public class SyncThisInstanceMethodExecutor { private int mCount = 0; public synchronized void execute(String threadName) { if (mCount == N) { LogUtils.d(threadName + ": do nothing"); } else { for (int i = 0; i < N; i++) { LogUtils.d(threadName + ": " + ++mCount); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * synchronized ????? */ public void asyncThisInstanceMethodExecute() { LogUtils.d(); AsyncThisInstanceMethodExecutor executor = new AsyncThisInstanceMethodExecutor(); new Thread(new AsyncThisInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new AsyncThisInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new AsyncThisInstanceMethodExecutorRunnable(executor, "C")).start(); } public class AsyncThisInstanceMethodExecutorRunnable implements Runnable { private AsyncThisInstanceMethodExecutor mExecutor; private String mThreadNmae; public AsyncThisInstanceMethodExecutorRunnable(AsyncThisInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute(mThreadNmae); } } /** * synchronized ????? */ public class AsyncThisInstanceMethodExecutor { private int mCount = 0; public final void execute(String threadName) { if (mCount == N) { LogUtils.d(threadName + ": do nothing"); } else { for (int i = 0; i < N; i++) { LogUtils.d(threadName + ": " + ++mCount); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * ? synchronized ???? */ public void syncLockInstanceMethodExecute() { LogUtils.d(); SyncLockInstanceMethodExecutor executor = new SyncLockInstanceMethodExecutor(); new Thread(new SyncLockInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new SyncLockInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new SyncLockInstanceMethodExecutorRunnable(executor, "C")).start(); } public class SyncLockInstanceMethodExecutorRunnable implements Runnable { private SyncLockInstanceMethodExecutor mExecutor; private String mThreadNmae; public SyncLockInstanceMethodExecutorRunnable(SyncLockInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute(mThreadNmae); } } /** * ? synchronized ???? */ public class SyncLockInstanceMethodExecutor { private final Object lock = new Object(); private int mCount = 0; public void execute(String threadName) { synchronized (lock) { if (mCount == N) { LogUtils.d(threadName + ": do nothing"); } else { for (int i = 0; i < N; i++) { LogUtils.d(threadName + ": " + ++mCount); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } } /** * ? synchronized ???? */ public void asyncLockInstanceMethodExecute() { LogUtils.d(); AsyncLockInstanceMethodExecutor executor = new AsyncLockInstanceMethodExecutor(); new Thread(new AsyncLockInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new AsyncLockInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new AsyncLockInstanceMethodExecutorRunnable(executor, "C")).start(); } public class AsyncLockInstanceMethodExecutorRunnable implements Runnable { private AsyncLockInstanceMethodExecutor mExecutor; private String mThreadNmae; public AsyncLockInstanceMethodExecutorRunnable(AsyncLockInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute(mThreadNmae); } } /** * ? synchronized ???? */ public class AsyncLockInstanceMethodExecutor { private int mCount = 0; public final void execute(String threadName) { if (mCount == N) { LogUtils.d(threadName + ": do nothing"); } else { for (int i = 0; i < N; i++) { LogUtils.d(threadName + ": " + ++mCount); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * synchronized ????????? */ public void syncMultiClassMethodExecute() { LogUtils.d(); SyncMultiClassMethodExecutor.count = 0; new Thread(new SyncMultiClassMethodExecutorRunnable("A")).start(); new Thread(new SyncMultiClassMethodExecutorRunnable("B")).start(); new Thread(new SyncMultiClassMethodExecutorRunnable("C")).start(); } public class SyncMultiClassMethodExecutorRunnable implements Runnable { String threadName; public SyncMultiClassMethodExecutorRunnable(String threadName) { this.threadName = threadName; } @Override public void run() { SyncMultiClassMethodExecutor.execute1(threadName); SyncMultiClassMethodExecutor.execute2(threadName); SyncMultiClassMethodExecutor.execute3(threadName); } } /** * synchronized ????????? */ public static class SyncMultiClassMethodExecutor { public static final String KEY = SyncMultiClassMethodExecutor.class.getSimpleName(); private static int count = 0; public static final synchronized void execute1(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[1]: " + ++count); } } public static final synchronized void execute2(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[2]: " + ++count); } } public static final synchronized void execute3(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[3]: " + ++count); } } } /** * synchronized ????????? */ public void asyncMultiClassMethodExecute() { LogUtils.d(); AsyncMultiClassMethodExecutor.count = 0; new Thread(new AsyncMultiClassMethodExecutorRunnable("A")).start(); new Thread(new AsyncMultiClassMethodExecutorRunnable("B")).start(); new Thread(new AsyncMultiClassMethodExecutorRunnable("C")).start(); } public class AsyncMultiClassMethodExecutorRunnable implements Runnable { String threadName; public AsyncMultiClassMethodExecutorRunnable(String threadName) { this.threadName = threadName; } @Override public void run() { AsyncMultiClassMethodExecutor.count = 0; AsyncMultiClassMethodExecutor.execute1(threadName); AsyncMultiClassMethodExecutor.execute2(threadName); AsyncMultiClassMethodExecutor.execute3(threadName); } } public static class AsyncMultiClassMethodExecutor { public static final String KEY = AsyncMultiClassMethodExecutor.class.getSimpleName(); private static int count = 0; public static final void execute1(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[1]: " + ++count); } } public static final void execute2(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[2]: " + ++count); } } public static final void execute3(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[3]: " + ++count); } } } public void syncMultiInstanceMethodExecute() { LogUtils.d(); SyncMultiInstanceMethodExecutor executor = new SyncMultiInstanceMethodExecutor(); new Thread(new SyncMultiInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new SyncMultiInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new SyncMultiInstanceMethodExecutorRunnable(executor, "C")).start(); } public class SyncMultiInstanceMethodExecutorRunnable implements Runnable { private SyncMultiInstanceMethodExecutor mExecutor; private String mThreadNmae; public SyncMultiInstanceMethodExecutorRunnable(SyncMultiInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute1(mThreadNmae); mExecutor.execute2(mThreadNmae); mExecutor.execute3(mThreadNmae); } } public class SyncMultiInstanceMethodExecutor { private final Object lock = new Object(); private int mCount = 0; public void execute1(String threadName) { synchronized (lock) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[1]: " + ++mCount); } } } public void execute2(String threadName) { synchronized (lock) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[2]: " + ++mCount); } } } public void execute3(String threadName) { synchronized (lock) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[3]: " + ++mCount); } } } } public void asyncMultiInstanceMethodExecute() { LogUtils.d(); AsyncMultiInstanceMethodExecutor executor = new AsyncMultiInstanceMethodExecutor(); new Thread(new AsyncMultiInstanceMethodExecutorRunnable(executor, "A")).start(); new Thread(new AsyncMultiInstanceMethodExecutorRunnable(executor, "B")).start(); new Thread(new AsyncMultiInstanceMethodExecutorRunnable(executor, "C")).start(); } public class AsyncMultiInstanceMethodExecutorRunnable implements Runnable { private AsyncMultiInstanceMethodExecutor mExecutor; private String mThreadNmae; public AsyncMultiInstanceMethodExecutorRunnable(AsyncMultiInstanceMethodExecutor executor, String threadNmae) { mExecutor = executor; mThreadNmae = threadNmae; } @Override public void run() { mExecutor.execute1(mThreadNmae); mExecutor.execute2(mThreadNmae); mExecutor.execute3(mThreadNmae); } } /** * synchronized ????????? */ public class AsyncMultiInstanceMethodExecutor { private int mCount = 0; public void execute1(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[1]: " + ++mCount); } } public void execute2(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[2]: " + ++mCount); } } public void execute3(String threadName) { for (int i = 0; i < N; i++) { LogUtils.d(threadName + "[3]: " + ++mCount); } } } }