マルチスレッドの同時およびコラボレーション
5295 ワード
マルチスレッドは1つのプロジェクトの実行効率を向上させることができ、マルチスレッド間のコラボレーションも避けられない.まず簡単な例を挙げます.まず最初のクラスを紹介します.
このクラスには2つのプライベートフィールドがあり、1つは文字列strで、1つはsynObjオブジェクトをロックし、もう1つのクラスでは、まず1つのThradStudioオブジェクトを宣言し、mainメソッドでは、2つのスレッドを起動し、1つのスレッドはstartを実行し、1つのスレッドは3秒後に別のスレッドコードを起動します.
実行結果は、まずAAAAAAAを出力し、その後「起動」を出力することを示す.
この例は理解しにくいかもしれませんが、以下ではsynchronizedとLockによって生産者と消費者を実現します.
一、ロック
中にはresource類があり、彼の中にはsetとpro方法があり、set方法は部品の生産を担当し、pro方法は部品の消費を担当し、部品がなければ生産しかできない.ProducerクラスとCustomerは、スレッドの継続的な生産と消費を実現します.
二、synchronized
実現原理はロックと同じ
package HelloWorld;
public class ThradStudy {
private String response ;
private Object synObj = new Object();
public void start(){
System.out.println("AAAAAAAAA");
try{
synchronized (synObj) {
synObj.wait(10000);
}
}
catch(Exception e ){
}
System.out.println(response);
}
public void notify(String a ){
response = a ;
synchronized(synObj){
synObj.notifyAll();
}
}
}
このクラスには2つのプライベートフィールドがあり、1つは文字列strで、1つはsynObjオブジェクトをロックし、もう1つのクラスでは、まず1つのThradStudioオブジェクトを宣言し、mainメソッドでは、2つのスレッドを起動し、1つのスレッドはstartを実行し、1つのスレッドは3秒後に別のスレッドコードを起動します.
package HelloWorld;
public class notyFyClass {
public static ThradStudy test = new ThradStudy() ;
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
test.start();
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(3000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
String str = " " ;
test.notify(str);
}
}).start();
}
}
実行結果は、まずAAAAAAAを出力し、その後「起動」を出力することを示す.
この例は理解しにくいかもしれませんが、以下ではsynchronizedとLockによって生産者と消費者を実現します.
一、ロック
package HelloWorld;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProduceCustomer {
public static void main(String[] args) {
Resouse sss = new Resouse();
Thread pro = new Thread(new Producer(sss));
Thread cus = new Thread(new Customer(sss));
pro.start();
cus.start();
}
}
class Resouse{
private Lock lock = new ReentrantLock();
private Condition conditionPro = lock.newCondition() ;
private Condition conditionCus = lock.newCondition() ;
private String name ;
private int count = 0 ;
private boolean flag = false ; //false
public void set(String name) throws Exception{
lock.lock();
try{
if(flag){
conditionPro.await();
}
count++ ;
this.name = name+count ;
conditionCus.signal();
flag = true ;
System.out.println(" "+this.name);
}
finally{
lock.unlock();
}
}
public void pro() throws Exception{
lock.lock() ;
try{
if(!flag){
conditionCus.await() ;
}
flag = false ;
System.out.println(" "+this.name);
conditionPro.signal();
}
finally{
lock.unlock();
}
}
}
class Producer extends Resouse implements Runnable{
private Resouse r ;
public Producer(Resouse re){
super();
r = re ;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
r.set(" ") ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Customer extends Resouse implements Runnable{
private Resouse r ;
public Customer(Resouse re ){
super();
r = re ;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
r.pro() ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
中にはresource類があり、彼の中にはsetとpro方法があり、set方法は部品の生産を担当し、pro方法は部品の消費を担当し、部品がなければ生産しかできない.ProducerクラスとCustomerは、スレッドの継続的な生産と消費を実現します.
二、synchronized
package HelloWorld;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProduceCustomer {
public static void main(String[] args) {
Resouse sss = new Resouse();
Thread pro = new Thread(new Producer(sss));
Thread cus = new Thread(new Customer(sss));
pro.start();
cus.start();
}
}
class Resouse{
private Object synObj = new Object();
private String name ;
private int count = 0 ;
private boolean flag = false ; //false
public void set(String name) throws Exception{
synchronized(synObj){
if(flag){
synObj.wait();
}
count++ ;
this.name = name+count ;
synObj.notify();
flag = true ;
System.out.println(" "+this.name);
}
}
public void pro() throws Exception{
synchronized(synObj){
if(!flag){
synObj.wait() ;
}
flag = false ;
System.out.println(" "+this.name);
synObj.notify();
}
}
}
class Producer extends Resouse implements Runnable{
private Resouse r ;
public Producer(Resouse re){
super();
r = re ;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
r.set(" ") ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Customer extends Resouse implements Runnable{
private Resouse r ;
public Customer(Resouse re ){
super();
r = re ;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
r.pro() ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
実現原理はロックと同じ