Threadの5日目の勉強
11063 ワード
1、スレッドごとに実行されるコードが同じであれば、同じRunnableオブジェクトを使用することができます.このRunnableオブジェクトにはその共有データがあります.例えば、チケット販売システムではそうすることができます.
2.スレッドごとに実行するコードが異なる場合、異なるRunnableオブジェクトを使用する必要があります.次の2つの方法でRunnableオブジェクト間のデータ共有を実現します.1)共有データを別のオブジェクトにカプセル化し、そのオブジェクトを個々のRunnableオブジェクトに渡します.各スレッドは、共有データの操作方法もそのオブジェクトに割り当てて完了し、そのデータに対して各操作の反発と通信を容易に実現する.
2)これらのRunnableオブジェクトをあるクラスの内部クラスとし,共有データをこの外部クラスのメンバ変数とし,各スレッドの共有データに対する操作方法も外部クラスに割り当て,共有データに対する各操作の反発と通信を実現し,内部クラスの各Runnableオブジェクトに対して外部クラスを呼び出すこれらの方法とする.
別の共有データモード:共有データを別のオブジェクトにカプセル化し、各スレッドの共有データに対する操作方法もそのオブジェクトに割り当てられ、オブジェクトはこの外部クラスのメンバー変数またはメソッドのローカル変数として、各スレッドのRunnableオブジェクトは外部クラスのメンバー内部クラスまたはローカル内部クラスとして機能します.
package com.thread.demo;
public class SellTicktThreadShareData {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket).start();
new Thread(ticket).start();
}
}
class Ticket implements Runnable{
private int count = 1000;
public void run()
{
while(true)
{
if(count <= 0)
{
break;
}
else
{
count--;
System.out.println(Thread.currentThread().getName()+" :"+count);
}
}
}
}
2.スレッドごとに実行するコードが異なる場合、異なるRunnableオブジェクトを使用する必要があります.次の2つの方法でRunnableオブジェクト間のデータ共有を実現します.1)共有データを別のオブジェクトにカプセル化し、そのオブジェクトを個々のRunnableオブジェクトに渡します.各スレッドは、共有データの操作方法もそのオブジェクトに割り当てて完了し、そのデータに対して各操作の反発と通信を容易に実現する.
package com.thread.demo;
public class MutiThreadShareData {
public static void main(String[] args) {
ShareData data = new ShareData();
new Thread(new ShareThreadOne(data)).start();
new Thread(new ShareThreadTwo(data)).start();
}
}
class ShareThreadOne implements Runnable{
private ShareData data ;
public ShareThreadOne(ShareData data){
this.data = data;
}
public void run()
{
data.decement();
}
}
class ShareThreadTwo implements Runnable{
private ShareData data ;
public ShareThreadTwo(ShareData data){
this.data = data;
}
public void run()
{
data.incement();
}
}
class ShareData {
int j = 0;
public synchronized void incement()
{
j++;
System.out.println(j);
}
public synchronized void decement()
{
j--;
System.out.println(j);
}
}
2)これらのRunnableオブジェクトをあるクラスの内部クラスとし,共有データをこの外部クラスのメンバ変数とし,各スレッドの共有データに対する操作方法も外部クラスに割り当て,共有データに対する各操作の反発と通信を実現し,内部クラスの各Runnableオブジェクトに対して外部クラスを呼び出すこれらの方法とする.
package com.thread.demo;
public class MutiThreadShareData2 {
private static ShareData2 data = new ShareData2();
public static void main(String[] args) {
new Thread(new Runnable(){
public void run()
{
data.decement();
}
}).start();
new Thread(new Runnable(){
public void run()
{
data.incement();
}
}).start();
}
}
class ShareData2 {
int j = 0;
public synchronized void incement()
{
j++;
System.out.println(j);
}
public synchronized void decement()
{
j--;
System.out.println(j);
}
}
別の共有データモード:共有データを別のオブジェクトにカプセル化し、各スレッドの共有データに対する操作方法もそのオブジェクトに割り当てられ、オブジェクトはこの外部クラスのメンバー変数またはメソッドのローカル変数として、各スレッドのRunnableオブジェクトは外部クラスのメンバー内部クラスまたはローカル内部クラスとして機能します.
package com.thread.demo;
public class ShareDataObject {
private static int i = 0;
public static void main(String[] args) {
ShareDataObject shareData = new ShareDataObject();
for(int i= 0;i<10;i++)
{
new Thread(shareData.new ShareDataThread1(),i+" 1 ").start();
new Thread(shareData.new ShareDataThread2(),i+" 2 ").start();
}
}
class ShareDataThread1 implements Runnable{
@Override
public synchronized void run() {
i++;
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ShareDataThread2 implements Runnable{
@Override
public synchronized void run() {
i--;
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
}