2017-10-24 6 views
0

可能かどうかわかりませんが、とにかく頼む価値はあると思います。 私は静的サイズのスレッドプールを持っています。メインスレッドは多くの非同期ジョブを実行し、任意のジョブはCompletableFutureと静的スレッドプールを使用して別のジョブを実行できます。スレッドプールからプロセスが実行された場合は親スレッドIDを取得する

public void doSomething() 
{ 
    asyncCallA(); 
} 

public void asyncCallA(){ 
    asyncCallB(); 
    asyncCallC(); 
} 

質問:asyncCallCの処理中には、()MainスレッドIDを識別することが可能ですか?あなたが親スレッドへの参照を持つことができる。例えば

+0

にあなたはそれをどうするかを意図していますか? – Kayaman

+1

スレッドには親子関係はありません。 asyncCallC()が文字通り他のスレッドにアクセスする必要がある場合は、おそらくasyncCallC()がアクセスできる場所にそのスレッドオブジェクトを格納する必要があります。ここで達成しようとしていることをより高いレベルで記述することを検討する必要があります。 – Kenster

+0

リクエストスコープを持たないhight並行Webサービスでは、グローバルオブジェクトを共有しようとしています。どのスレッドでもアクセス可能である必要があります。 –

答えて

0

あなたはより多くのコードを与える場合は、解決策を提案する方が簡単かもしれないが(私は適切な目標を理解していれば)それを達成するには、いくつかの方法がある

スレッドクラス。新しいスレッドを作成すると、その参照が渡されます。

class A extends Thread 
{ 
    Thread parent; 
    public A(Thread parent) 
    { 
     this.parent=parent; 
    } 
} 

ようなものが最良の方法が、あなたはあなたを呼び出したスレッドへの参照を持っているこの方法ではないかもしれません。次に、それを同期ブロックでアクセスする必要があります。この方法でスレッドツリーのノードを繰り返し処理できます)

メインスレッドだけが必要な場合は、静的変数を定義できます。静的なので、すべてのスレッドで同じです。例えばAClassは.mainThreadObjectによってST

static AClass mainThreadObject=this; 

、その後、他のスレッドでは、あなたがそれにアクセス

+0

私は新しいスレッドを作成していません。グローバルオブジェクトを必要とするのであれば、スレッドプール –

+0

から来ています。最良の解決策ではないかもしれませんが、結局のところグローバルであり、スレッド間で共有されます –

+0

Webserviceはリクエストスコープをサポートしていないため、グローバルオブジェクトはすべてのリクエストで共有されるため、私の場合は面倒です。私はそれを、または少なくとも私は何とかそれを区別する方法を見つけたいと思うことはありません。 ThreadIdはアイデアでした。 –

関連する問題