以下の(抜粋後の)ミッドレットコード(クラスMoo)のシンプルなデッドロック(スレッドhereでこの記事を読んだ後は、少なくともデッドロックと仮定します)。私はポストから関連抜粋再現しておりj2meネットワーキング、スレッド、デッドロック
:
String url = ...
Connection conn = null;
try {
conn = Connector.open(url);
// do something here
}
catch(IOException e){
// error
}
を問題の根本はオープン()呼び出しのブロッキング性質です。一部のプラットフォームでは、システムは実際の接続をカバーの下で行います。別のスレッドと同等です。呼び出しスレッドは、接続スレッドが接続を確立するまでブロックします。同時に、セキュリティサブシステムは、ユーザーに接続を確認する必要があり、接続スレッドは、イベントスレッドがユーザーからの確認を取得するまでブロックします。デッドロックは、イベントスレッドがすでに接続スレッドを待っているために発生します。システムスレッドの呼び出しは、ここで行わ(イベントと通知スレッド)とデッドロックにつながる一連のイベントする方法
public class Moo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
MyCanvas myCanvas = new MyCanvas();
display.setCurrent(myCanvas);
myCanvas.repaint();
}
class MyCanvas extends Canvas {
protected void paint(Graphics graphics) {
try {
Image bgImage = Image.createImage(getWidth(), getHeight());
HttpConnection httpConnection = (HttpConnection) Connector
.open("http://stackoverflow.com/content/img/so/logo.png");
Image image = Image.createImage(httpConnection
.openInputStream());
bgImage.getGraphics().drawImage(image, 0, 0, 0);
httpConnection.close();
graphics.drawImage(bgImage, 0, 0, 0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
は、誰かが私に教えてくださいすることができます。デッドロックの原因となっているスレッドが何であるかについては明確ではありません。
- j2meスレッドモデルに関する資料はありますか?
- どこでj2meシステムクラスのソースを取得できますか(Connectionクラスの実装をチェックします)
EDIT:上記のコードでは、ロジックが得られます。しかし、以下のコードは少なくとも正しく動作するはずですか?これはまた、別のスレッドでネットワーク接続を行っているところでデッドロックします。
public class Foo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
MyCanvas myCanvas = new MyCanvas();
display.setCurrent(myCanvas);
myCanvas.repaint();
}
class MyCanvas extends Canvas {
protected void paint(Graphics graphics) {
try {
Image bgImage = Image.createImage(getWidth(), getHeight());
FetchImage fetchImage = new FetchImage();
Thread thread = new Thread(fetchImage);
thread.start();
thread.join();
bgImage.getGraphics().drawImage(fetchImage.image, 0, 0, 0);
graphics.drawImage(bgImage, 0, 0, 0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class FetchImage implements Runnable {
public Image image;
public void run() {
HttpConnection httpConnection;
try {
httpConnection = (HttpConnection) Connector
.open("http://10.4.71.200/stage/images/front/car.png");
image = Image.createImage(httpConnection.openInputStream());
httpConnection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
優れた質問と答え、特にあなたが本当にこのスレッディングのものを明確にしたいならば。 – Sydwell