• ベストアンサー

スレッドの優先順位に関して

ninoueの回答

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.2

このプログラムの場合、シングルコアCPU/シングルスレッド実行のシステムでは"B A B A B A"と決まった順序で実行されるはずです。 しかし最近のプロセッサではマルチCPU、或いはシングルCPUでもH/W的にマルチスレッド実行可能なものが殆どです。 プログラムが最初にスケジュールされる順序は、プログラムのスケジュールリストは全CPU同一のリストを参照しますので優先順序通りになります。 ここで例えば、'A',及び'B'を印字すべきプログラムが同時に別々のCPUで実行中に、途中で外部割込みが優先度の高い'A'プログラム実行中のCPU側に入ることも考えられます。 その場合'A'が中断している間に'B'は続行し、先に'B'が印字されることもありえます。 以上の通り、特にI/Oの割合が多いプログラムでは、細かく見ていくと優先順序通りにはならない場合が多くなります。

ftrgp
質問者

補足

連絡が遅くなりすいません。 わかり易い説明をありがとうございます。 シングルコアCPU/シングルスレッド実行のシステムについて おかげ様で理解する事ができましたが、 一つだけyieldに関しては、上のプログラムでいくと、 まず最初に優先順位の高いBがyieldを触れた時点で 実行可能状態に戻りますが、上の私が書いたyieldの説明でいくと 優先順位がBの方が高い為 すぐにまたBが実行状態に戻る事になると思います。 そうするとB A B A B Aにはならないように思うんですが、 もしよろしければyieldについて教えていただけませんか?

関連するQ&A

  • スレッドの実行結果表示順について

    java学習超初心者です。一人で勉強しています。 以下のコードの実行結果に対して質問があります。 class MyThread extends Thread{ public void run(){ for (int i=1;i<=8; i++){ System.out.println("*************************サブスレッドも動いています********" + i); } } } public class JaThrd1{ public static void main (String args[]){ MyThread aa = new MyThread(); aa.start(); for(int i=1; i<=12; i++){ System.out.println("メインスレッドで仕事中です" + i); } } } 実行結果が↓です *************************サブスレッドも動いています********1 メインスレッドで仕事中です1 *************************サブスレッドも動いています********2 メインスレッドで仕事中です2 *************************サブスレッドも動いています********3 メインスレッドで仕事中です3 *************************サブスレッドも動いています********4 メインスレッドで仕事中です4 *************************サブスレッドも動いています********5 メインスレッドで仕事中です5 *************************サブスレッドも動いています********6 メインスレッドで仕事中です6 *************************サブスレッドも動いています********7 メインスレッドで仕事中です7 *************************サブスレッドも動いています********8 メインスレッドで仕事中です8 メインスレッドで仕事中です9 メインスレッドで仕事中です10 メインスレッドで仕事中です11 メインスレッドで仕事中です12 なぜこのような順番の結果になるのでしょうか? 交互に表示されることがわかりません。

    • ベストアンサー
    • Java
  • ThreadとRunnableのlogへの表示差異

    マルチスレッドでsleep()の時間を指定して動かすのを前提で、 Threadを継承した時は、時間通りに(リアルタイムで) eclipseのコンソールへ表示されるのですが、 Runnableをインプリメントしての動作では、 eclipseのコンソールに一瞬で表示されるのは何故でしょうか? public class MultiThread3 implements Runnable{ int time; MultiThread3(int time) { this.time = time; } public void run() { for(int i=0; i<5; i++) System.out.println("No."+i+":"+Thread.currentThread().getName()); try{ Thread.sleep(time); }catch (InterruptedException e) {} } } class MultiThreadTest3{ public static void main(String[] args) { MultiThread3 a = new MultiThread3(500); MultiThread3 b = new MultiThread3(700); MultiThread3 c = new MultiThread3(1100); Thread ta = new Thread(a); Thread tb = new Thread(b); Thread tc = new Thread(c); ta.setName("A"); tb.setName("\tB"); tc.setName("\t\tC"); ta.start(); tb.start(); tc.start(); } }

    • ベストアンサー
    • Java
  • 優先順位の概念について質問

    質問1:優先順位や結合の規則とは、本質的に「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位」ではありませんよね? 何故そう思ったかというと次の論理式をご覧ください。 a==1 && b==0 || a==1 && b==0 ※int a==1,b==0 この論理式がtureになるプロセスとして、 a==1を評価→true    ↓ b==0を評価→true ↓ &&は、a==1 && b==0の論理式をtrueと評価 ↓ ||は、左側の論理式a==1 && b==0がtrueだから、論理式全体がtrueだと判断し、 右側の論理式の評価を行わない。 プロセスとして、こうだと思うんですけど、優先順位として||は&&より低いですよね? 優先順位が「演算実行の優先順位」を意味するならば、右側の論理式のa==1 && b==0を評価してから||の演算をするはずで矛盾します。 よって、優先順位とは本質的に、「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位ではない」といえる。 質問2:「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であれば、例えば、上記の論理式の左側を例に挙げていえば、 b==0は&&と||の2つが共有してるが、&&の方が優先順位が高いから、b==0を先に結び付けてる、その意味でも「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」 は正しいですか?

    • ベストアンサー
    • Java
  • スレッドのスケジューリングポリシーと優先順位の設定(pthread)

    こんにちは。今、マルチスレッドのプログラミングをする上で困っていることがあります。 pthread(スレッド)の優先順位をどのように変更するのかがわかりません。 また、メインの優先順位も変更したいのですがよくわかりません。 現在、↓のようにやっていますが、変更されていないような気がします。 間違っているようであればご指摘やアドバイスをいただけるとうれしいです。 宜しくお願いします。 ------------------------- int main(){ int policy; pthread_t th; pthread_attr_t th_att; struct sched_param scp; /* pthread の優先順位の変更 */ scp.sched_priority = 50; /* この値は適当です…*/ policy = SCHED_FIFO; pthread_attr_init(&th_att); pthread_attr_setschedpolicy(&th_att,policy,&scp) /* mainの優先順位の変更*/ scp.sched_priority = 30; /* この値は適当です…*/ pthread_setschedparam(pthread_self(),policy,&scp) pthread_create(&th,&th_att,(void*)func,NULL); . . .

  • スレッド間の送受信のコードについて

    下記のコードは、(以前お教え頂きました)『synchronized』を使用した、スレッド間の 送受信のコードですが、その代わりに、Interruptとか、Thread.sleep()を使用した、 コードに変更してみたいと思います。 Q1)そのコードをお教え頂けないでしょうか? class T_thread { public static void main(String args[]) { new rcvInterrupt().start(); } } class genInterrupt extends Thread { private rcvInterrupt target; genInterrupt(rcvInterrupt targetx) { this.target = targetx; } public void run() { System.out.println("genInterupt start"); for (int i = 0; i < 10; i++) { while (!target.isWaited) { // rcvInterruptがsynchronizedブロックに入るまで待ち合わせ // これがないと連続してsynchronizedしてしまう可能性がある } synchronized (target) { target.notifyAll(); target.isWaited = false; System.out.println("notify"); } } } } class rcvInterrupt extends Thread { volatile boolean isWaited; public synchronized void run() { new genInterrupt(this).start(); for (int i = 0; i < 10; i++) { try { isWaited = true; wait(); System.out.println("get interrupt cnt=" + i); } catch (InterruptedException e1) { } } } } 以上

    • ベストアンサー
    • Java
  • 主キーソート(キーの優先順位をつけてソート)

    時刻から生成した乱数を、構造体「TEST」のメンバ変数 a, b, c に代入し、 メンバb を基準にして、昇順にクイックソートしてみます。 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct{ int a; int b; int c; }TEST; int comp( const void *c1, const void *c2 ); int main(void) { int i; TEST base[10]; /* 乱数の生成 */ srand( (unsigned int)time( NULL ) ); for( i=0; i<10; i++ ){ base[i].a = rand() % 100; /* 0~99の乱数 */ base[i].b = rand() % 100; base[i].c = rand() % 100; printf( "%d¥t", base[i].a ); printf( "%d¥t", base[i].b ); printf( "%d¥t", base[i].c ); printf( "¥n" ); } /* TEST構造体のbを基準にソート */ printf( "¥n--TEST構造体のbを基準にソート--¥n¥n" ); qsort( base, 10, sizeof(TEST), comp ); /* ソート後のデータを表示 */ for( i=0; i<10; i++ ){ printf( "%d¥t", base[i].a ); printf( "%d¥t", base[i].b ); printf( "%d¥t", base[i].c ); printf( "¥n" ); } return 0; } /* 比較関数 */ int comp( const void *c1, const void *c2 ) { TEST test1 = *(TEST *)c1; TEST test2 = *(TEST *)c2; int tmp1 = test1.b; /* b を基準とする */ int tmp2 = test2.b; return tmp1 - tmp2; } ランダム結果 13 22 21 63 21 45 52 45 81 75 67 94 7 1 44 81 66 38 35 24 35 62 6 4 76 12 84 86 77 71 --TEST構造体のbを基準にソート-- 7 1 44 62 6 4 76 12 84 63 21 45 13 22 21 35 24 35 52 45 81 81 66 38 75 67 94 86 77 71 と、このように表示されます。 下段の真ん中の列を見ると、メンバ変数 b で並び替えられている事が分かります。 比較関数comp内では、TEST構造体でキャストしてから、bを取り出しています。 また、戻り値に「tmp1 - tmp2」を使うことで、 「a < b :負の値、a == b :0、 a > b :正の値」という条件に当てはめています。 とhttp://simd.jugem.jp/?eid=116で書かれていますが これはb列を基準にしたソートであり、a列とc列の優先順位は書かれていません キーの優先順位をb>a>cにするにはどうしたらよいでしょうか。 もっとたくさんキーあった時(a>b>c>d>e>f>g・・・)のようにキーの優先順位つけて昇順or降順にデータをソートしたいです。 よろしくお願いします

  • Javaのメソッドについて

    Javaの参考書を見ていて分からない点があります。 Kadaiクラスで使用したcurrentThreadメソッドは、 Thread.currentThread()と書いてもthis.currentThread()と書いても 実行結果が同じになります。 currentThreadメソッドは静的メソッドなのに、 なぜthis.currentThread()でも良いのか分かりません。 this.currentThread()も静的メソッドなのでしょうか? class SampleThread{ public static void main(String[] args){ Thread t1=new Kadai(); t1.setName("Minimum"); //スレッド名を設定 t1.setPriority(Thread.MIN_PRIORITY); //優先順位を設定 Kadai t2=new Kadai(); t2.setName("Normal"); t2.setPriority(Thread.NORM_PRIORITY); Kadai t3=new Kadai(); t3.setName("Maximum"); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); //プライオリティが最低のスレッドを実行 t2.start(); //プライオリティが普通のスレッドを実行 t3.start(); //プライオリティが最優先のスレッドを実行 } } class Kadai extends Thread{ public void run(){ Thread t=this.currentThread(); //スレッド情報を取得 System.out.println("スレッド名:"+t.getName()+" プライオリティ:"+t.getPriority()); } }

    • ベストアンサー
    • Java
  • 優先順位を決定するアルゴリズム

    優先順位を決定するアルゴリズムがありましたら ご教授下さい. やりたい事は,以下の通りです. ・A,Bの二人がいる. ・二人はそれぞれというパラメータを持つ. ・各自パラメータに優先順位をつけている. ・二人にとってのパラメータの優先順位を決定する 例)A,Bがそれぞれ,a,b,cというパラメータを持つ. 各自パラメータに優先順位をつけている. A a:1 b:2 c:3 B a:2 b:2 c:1 この時,二人にとってのパラメータの優先順位を決定する.私は,以下の方法を考えました. 1.二人のパラメータの優先順位を足して 合計値を計算する. 2.値が同じ場合は,値の分散値が低い方が,優先順位が低いとする a:1+2 = 3 b:2+2 = 4 c :3+1 = 4 bの分散値の二乗:(2-2)の二乗 + (2-2)の二乗 cの分散値の二乗:(3-1)の二乗 + (2-1)の二乗 よって,bとcでは,bの方が優先順位が低いとする この他にも,優先順位を決定するアルゴリズムに関して,他の方法や,既存研究等がありましたらご教授下さい.

  • java Threadのsleepを途中で止める方

    今、訓練校に通っていて課題をだされていますが、どうもうまく行きませんのでお知恵を拝借したく思います。  java Threadのsleepを使用し、クイズの回答を10秒以内で答えるというものですが、 途中で入力をすると、次の問題の回答時間が異様に早くなり1秒ではなくなってしまいます。  こういう場合、入力をすれば、runメソッドが終わるというプログラムはどうやって書けばいいのか教えて頂きたく思います。 どうぞよろしくお願いいたします。 <下記、threadの部分だけですが、パッケージを使用するという課題のため無理やり使っています。> package pa; public class CountTest extends Thread { public void start() { super.start(); } public void run() { for (int i=10; i >= 1; i--) { try{ sleep(1000); System.out.print("⇒" ); }catch(InterruptedException e){} } System.out.println(""); for (int i=1; i >= 1; i--) { / } System.out.println("Time up "); System.out.println(""); System.out.println("1-4で答えを記入してください"); }

    • ベストアンサー
    • Java
  • ローカル変数にアクセスする複数のスレッドの振る舞いについて

    早速ではございますが、質問をさせていただきます。 以下のコード中のMonitorクラスを複数のスレッドが 共有して自由に入り込んでいるにも関わらす、 排他制御をしていないのにBROKENと表示されません。 final class Main { private final static int NUM = 10; public static void main(String[] args) { Monitor m = new Monitor(); UserThread[] ut = new UserThread[NUM]; Thread[] t = new Thread[NUM]; for(int i=0;i<NUM;i++) { ut[i] = new UserThread(m); t[i] = new Thread(ut[i]); t[i].start(); } } } final class UserThread implements Runnable { private final Monitor m; public UserThread(Monitor m) { this.m = m; } public void run() { System.out.println (Thread.currentThread().getName()+" BEGIN"); while(true) { this.m.func(); } } } final class Monitor { public void func() { int i1 = 0; int i2 = 0; i1++; i2++; if(i1 != i2) { System.out.println ("***** BROKEN ***** " +i1+"と"+i2); } } } 動作確認を2日間くらい行っているのですが、それでも BROKENと表示してくれません。javaの処理系によって 振る舞いがことなるかもしれませんので一概には言えませ んが、いったいなぜBROKENと表示しないのでしょうか? どうかご教授のほどよろしくお願いします。

    • ベストアンサー
    • Java