ビッグデータ8日目の内容
:
jar
---------------
jar cvf xxx.jar -C classes/.
プロセス
-----------------
プロセス間でメモリが分離されています.メモリは共有されません.
スレッド
-----------------
プログラム実行中に同時実行されるコードセグメント.
スレッド間でメモリを共有できます.
Thread:スレッドクラス.
start()/cpuに通知し、スレッドの実行を開始できます.
run()/スレッドが具体的に実行するコードセグメント.
Thread t = new Thread();
t.start();
Thread.CurrentThread()/現在の実行スレッドを取得します.
yield()/スレッドにcpuのプリエンプト権を放棄させる.
sleep(int mils)/現在のスレッドを指定したミリ秒数スリープ.ロックフラグは解放されません
join//スレッド実行が終了したら別のスレッドを実行
start//cpuがスレッドを起動できることを通知
run//スレッドの主な方法
isDaemon();//スレッドがデーモンスレッドかどうかを指定する
start();//スレッドの起動
notify()/通知のためにモニタオブジェクトがキュー内のスレッドを待つように選択します.
notifyAll()/すべてのモニタオブジェクト待機キュー内のスレッドを選択して通知します.
wait()/現在のスレッドをモニタの待機キューに入れます.
wait(int n)/スレッドが待機キューに入ると、最大n長時間待機し、自動的に起動します.
スレッドセキュリティ:同期処理が追加されました.同期コードを実行するスレッドが1つしかないことを確認します.
同期メソッドで使用される現在のオブジェクトを同期オブジェクトとして使用します.
デーモンスレッド:
daemon setDaemon(true);//スレッド起動前の設定
同期コードブロック
private static Object lock = new Object();
//静的オブジェクトlockを作成します.lockはロックフラグです.
synchronized(lock){}
//この範囲のプロセスは同期的に実行され、コードが一定期間に1つのスレッドしか同じ実行できないことを保証する.
synchronized
//同期関数で使用されるロックフラグが現在のオブジェクト---this
スレッドのセキュリティ:
synchronized
同期処理が追加されました.同期コードを実行するスレッドが1つしかないことを確認します.
同期メソッドで使用される現在のオブジェクトを同期オブジェクトとして使用します.
静的メソッドは同期処理を加え、Classを同期オブジェクトとして使用することができます.
例:
ケース1マージャン
package com.work.eight;
import java.lang.Thread; //
class Member extends Thread{ //
private String name;
private int seconds;
public Member (String name, int sec){
this.name=name;
this.seconds=sec;
}
// run
public void run(){
try{ // , try catch
System.out.println(" :"+name+" !");
//System.out.println(seconds*1000);
System.out.println(" :"+name+" ! :"+seconds+" !");
}
catch(Exception e){
e.printStackTrace();
}
}
}
class Demo1{
public static void main(String [] args) throws Exception{
//new
Member m1 = new Member (" ",5);
Member m2 = new Member (" ",15);
Member m3 = new Member (" ",10);
Member m4 = new Member (" ",8);
//
m1.start();
m2.start();
m3.start();
m4.start();
//
m1.join(); // join , , 。
m2.join();
m3.join();
m4.join();
System.out.println(" , ");
}
}
:
: !
: !
: !
: !
: ! :15 !
: ! :8 !
: ! :10 !
: ! :5 !
,
ケース2カラオケ
package com.work.eight;
import java.lang.Thread;
import java.util.Date;
class Box extends Thread{ //Box
private String boxNo; //
private int sec;
public Box(String boxNo, int sec){ //
this.boxNo =boxNo;
this.sec =sec ;
}
// run
public void run(){
System.out.println(boxNo + " !!!!"); //
try{ //
Thread.sleep(sec*1000);
}
catch(Exception e){
}
System.out.println(boxNo + " ----");
}
}
// ( )
class Waiter extends Thread {
private String name;
private int idNo;
private int sec;
public Waiter (String name ,int idNo,int sec){ //
this.name = name;
this.idNo = idNo;
this.sec = sec ;
}
// run
public void run(){
// 1
while(true){
try{
System.out.println(idNo+" "+name+" , "+new Date());
Thread.sleep(sec*1000);
}
catch(Exception e){
}
}
}
}
class Demo2 { // Demo
public static void main(String [] args){
Box bo1 = new Box("1",10) ; // 3 box waiter
Box bo2 = new Box("2",10) ;
Box bo3 = new Box("3",5) ;
Waiter w1 =new Waiter("Kistina",66,1);
w1.setDaemon(true); // Thread.setDaemon(true);
// ,
bo1.start();
bo2.start();
bo3.start();
w1.start();
}
}
:
1 !!!!
3 !!!!
2 !!!!
66 Kistina , Thu May 17 10:29:54 CST 2016
66 Kistina , Thu May 17 10:29:55 CST 2016
66 Kistina , Thu May 17 10:29:56 CST 2016
66 Kistina , Thu May 17 10:29:57 CST 2016
66 Kistina , Thu May 17 10:29:58 CST 2016
3 ----
66 Kistina , Thu May 17 10:29:59 CST 2016
66 Kistina , Thu May 17 10:30:00 CST 2016
66 Kistina , Thu May 17 10:30:01 CST 2016
66 Kistina , Thu May 17 10:30:02 CST 2016
66 Kistina , Thu May 17 10:30:03 CST 2016
1 ----
2 ----
66 Kistina , Thu May 17 10:30:04 CST 2016
ケース3チケット販売
package com.work.eight;
class Saler extends Thread{ //
private String name ;
private static int tickets = 100 ; // , 100
private static Object lock = new Object() ; // lock lock
public Saler(String name ){ //
this.name =name ;
}
public void run (){ //run
while(tickets >0){ //while
synchronized(lock) { //
int temp = tickets ;
tickets = temp -1;
System.out.println(name+": :T"+temp);
}
yield(); // , cpu
}
}
}
class TicketDemo{
public static void main (String[] args){
Saler s1 = new Saler(" 1");
Saler s2 = new Saler(" 2");
s1.start();
s2.start();
}
}
( ):
1: :T100
1: :T99
1: :T98
1: :T97
2: :T96
2: :T95
2: :T94
2: :T93
ジョブ:
1.5台の自動車が洞窟を通って、順番に洞窟を通った.各車は洞窟を通過するのに10秒かかり、マルチスレッドで実現します.
コード#コード#
package com.work.eight;
class Car extends Thread{
Hole hole =new Hole (" ",1);
private String brand; //
private int carNo; //
private int sec; //
public Car(int carNo,String brand,int sec){
this.brand=brand;
this.carNo=carNo;
this.sec=sec;
}
public void run(){
synchronized(hole){ //
System.out.println(" "+carNo+" "+brand+" "+hole.getHolename()+" "+hole.getHolelong()+" ");
try{
Thread.sleep(sec*1000);
System.out.println(" "+carNo+" "+brand+" "+sec+" !");
}
catch(Exception e){}
}
}
}
class Hole {
private String holename; //
private int holelong; //
public Hole(String holename, int holelong){
this.holename=holename;
this.holelong=holelong;
}
public String getHolename() {
return holename;
}
public void setHolename(String holename) {
this.holename = holename;
}
public int getHolelong() {
return holelong;
}
public void setHolelong(int holelong) {
this.holelong = holelong;
}
}
class CrossHoleDemo{
public static void main(String[] args) throws Exception{
//
Car c1 = new Car(1," ",10);
Car c2 = new Car(2," ",10);
Car c3 = new Car(3," ",10);
Car c4 = new Car(4," ",10);
Car c5 = new Car(5," ",10);
//
c1.start();
c1.join();
c2.start();
c2.join();
c3.start();
c3.join();
c4.start();
c4.join();
c5.start();
c5.join();
}
}
:
1 1
1 10 !
2 1
2 10 !
3 1
3 10 !
4 1
4 10 !
5 1
5 10 !
2.
ミツバチと熊の関係をマルチスレッドでシミュレートした.
ミツバチは生産者で、熊は消費者です.ミツバチがハチミツを生産するのは積み重ねの過程であり、熊がハチミツを食べるのはロット(100いっぱい食べる)の過程である.
生産者と消費者の間では通知方式で相手に知らせる.デッドロックが発生しないように注意してください.
コード:
package com.work.eight;
class Bear extends Thread{
private FengMi fengmi;
private String bearname;
public Bear(FengMi fengmi,String bearname){
this.fengmi=fengmi;
this.bearname=bearname;
}
public void run(){
while(true){
synchronized(fengmi){
if (fengmi.getFemgminum()<100) {
try {
fengmi.wait();
}
catch (Exception e){
}
}
else if(fengmi.getFemgminum()>=100&&fengmi.getFemgminum()%100==0){
fengmi.ChiFemgmi();
System.out.println("100 "+bearname+" , "+fengmi.getFemgminum()+" ");
try{
fengmi.notifyAll();
}
catch(Exception e){
}
}
}
yield();
}
}
}
class FengMi {
private static int femgminum=0; //
private final int femgminumMax=500; //
public static int getFemgminum() {
return femgminum;
}
public int getFemgminum1() {
return femgminumMax;
}
public int getFemgminumMax() {
return femgminumMax;
}
public void CreateFemgmi() { //
this.femgminum += 1;
}
public void ChiFemgmi() { //
this.femgminum -=100;
}
}
class Bee extends Thread{
private FengMi fengmi;
private String beename;
public Bee(FengMi fengmi,String beename){
this.fengmi=fengmi;
this.beename=beename;
}
public void run(){
int i=1;
while(true){
synchronized(fengmi){
if(fengmi.getFemgminum()<fengmi.getFemgminumMax()&&fengmi.getFemgminum()>=0){
if (fengmi.getFemgminum()%100==0){
try{
System.out.println(" , "+fengmi.getFemgminum()+" , ");
fengmi.CreateFemgmi();
fengmi.notifyAll();
Thread.sleep(50);
}
catch(Exception e){
}
}
else {
fengmi.CreateFemgmi();
System.out.println(" , "+fengmi.getFemgminum()+" ");
try{
fengmi.notifyAll();
Thread.sleep(50);
}
catch(Exception e){
}
}
}
else if(fengmi.getFemgminum()>=fengmi.getFemgminumMax()){
System.out.println(" ");
try{
fengmi.wait();
}
catch(Exception e){
}
}
}
i++;
yield();
}
}
}
class BeeBearModel{
public static void main(String[] args){
FengMi fengmi=new FengMi();
Bear bear1=new Bear(fengmi,"Bear1");
Bee bee=new Bee(fengmi,"Bee1");
bear1.start();
bee.start();
}
}
結果(部分):
ハチミツは採集して、現在全部で95個のハチミツ
ハチミツは採集して、現在全部で96個のハチミツ
ハチミツは採集して、現在全部で97個のハチミツ
ハチミツは採集して、現在全部で98個のハチミツ
ハチミツは採集して、現在全部で99個のハチミツ
ハチミツは採集して、現在全部で100個のハチミツ
100個のハチミツはBear 1に食べられ、残りは0個のハチミツ
ハチミツは採集して、現在全部で0個のハチミツ、熊は採集することができます
ハチミツは採集して、現在全部で2つのハチミツ
ハチミツは採集して、現在全部で3つのハチミツ
ハチミツは採集して、現在全部で4つのハチミツ
ハチミツは採集して、現在全部で5つのハチミツ