これは、スレッドを同期させるためにMonitorを使用するマルチスレッドの方法です。私はモニタや同期化に問題はなく、デッドロックはありません。私は主にいくつかのスレッドを作成したい。以下のコードはスレッドを生成し、ArrayListに追加して開始します。スイッチケースで異なるスレッドを生成します。すべてのスレッドをArrayListに追加して開始する必要があるため、これらの2行をswitch-caseの最後に置いて、すべてのcase-stateで同じコードを書き込まないようにします。しかし、このようにして、IllegalThreadStateExceptionを起動します。スレッドを避けるために作成する方法IllegalThreadStateException
私のコードを動作させるために、私はさまざまなアプローチを適用できますが、私はそれらのすべてに疑念を抱いています。どちらが最も適切な方法でしょうか?
新しいmyThreadインスタンスを作成する関数を作成し、それをArrayListに追加して起動します。しかし、私はメインから呼び出す必要があるので、静的でなければなりません(正当な理由なく静的関数を作成することは良い習慣ではありません)。それはmyClassの多くのインスタンスを作成し、良いと思われません。
public class myClass {
public static void main(String[] args) {
int scount=10, tcount=5, pcount=5;
final int SIZE = 20;
ArrayList<User> users = new ArrayList<User>();
myMonitor monitor = new myMonitor(SIZE);
User u = null;
int s = 0, t = 0, p = 0; //counters
//GENERATED CASUALLY DIFFERENT TYPE OF THREADS
while(s < scount || t < tcount || p < pcount){
int type = (int)(Math.random() * 3);
switch(type){
case 0:
if(p < pcount){
u = new User(monitor, p, "USER_TYPE_1");
p++;
}
break;
case 1:
if(t < tcount){
u = new User(monitor, p, "USER_TYPE_2");
t++;
}
break;
case 2:
if(s < scount){
u = new User(monitor, p, "USER_TYPE_2");
s++;
}
break;
}
users.add(u);
u.start();
}
}
}
public class User extends Thread{
myMonitor monitor;
final private int number;
final private String type;
final private int k;
final private int MIN = 1;
final private int MAX = 5;
public User(myMonitor monitor, int number, String type) {
this.monitor = monitor;
this.number = number;
this.type = type;
this.k = (int)(Math.random() * ((MAX - MIN) + 1)) + MIN;
}
public int getNumber() {
return number;
}
public String getType() {
return type;
}
@Override
public void run(){
for(int i=0; i<k; i++){
switch(this.type){
case "TYPE1":
monitor.startType1();
break;
case "TYPE2":
monitor.startType2(i);
break;
case "TYPE3":
monitor.startType3();
break;
}
try{
Long duration = (long) Math.ceil(Math.random() * 1000);
Thread.sleep(duration);
System.out.printf("%s-%d used system for the %d.time. Took %d ms\n",
this.type, this.number, i+1, duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch(this.type){
case "TYPE1":
monitor.endType1();
break;
case "TYPE2":
monitor.endType2(i);
break;
case "TYPE3":
monitor.endType3();
break;
}
try{
Long duration = (long) Math.ceil(Math.random() * 1000);
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.printf("%s-%d finished\n", this.type, this.number);
}
}
:さて、あなたは実際にはは乱数を生成したくないですか?このコードは絶対に意味をなさない。あなたはJavaで長いプログラミングをしていませんでしたか? – Kayaman
これは単なるマルチスレッドの例です。私は同期などで問題がないので、コードを追加しませんでした。しかし今はそれを編集しました、私はそれがより明確であることを望みます。しかし、それはどのくらい私はJavaのプログラムに依存しない... – user3717434