2

私は初心者で、私が何を望んでいるのか明確でない場合はご容赦ください。サブミットをクリックすると2つのmysqlテーブルに挿入されるJavaアプリがあります。1つはローカルマシン上にあり、もう1つはWebサーバー上にあります。問題は、それぞれに 1 つずつ、2 つのスレッドを作成したことです。アプリを初めて起動して開始したときは正常に動作しますが、アプリの実行中に [送信] をクリックして再度挿入しようとすると、何もしません。再びアプリを再起動すると、初めて正常に動作します。私の質問は、アプリの同じインスタンスで、スレッドを停止するか、スレッドの新しいインスタンスを終了して開始する方法です。

明確でない場合は申し訳ありません。

コードはこちら

  final int m = MSfuntion.getmemomoc();

 Thread t1 = new Thread(new Runnable(){
 public void run()
 { 
while(runt1){

try{
        for(int i=0;i<=jTable2.getRowCount();i++)
            {
                Object slno= jTable2.getValueAt(i, 1);
                Object item2=  jTable2.getValueAt(i, 2);
                Object size2= jTable2.getValueAt(i, 3);

                String it = slno.toString();
                String si = item2.toString();
                int qt = Integer.parseInt(size2.toString());

                MSfuntion.saledetails(m,it, si, qt);
                //MSfuntion.saledetailsweb(m,it, si, qt);
                sc=0;
            }
        }catch(Exception e)
        {
        e.printStackTrace();
        }
    runt1=false;

   }
  }

});
 Thread t2 = new Thread(new Runnable(){

 public void run()
{ 
while(runt2){

 try{
        for(int i=0;i<=jTable2.getRowCount();i++)
            {
                Object slno= jTable2.getValueAt(i, 1);
                Object item2=  jTable2.getValueAt(i, 2);
                Object size2= jTable2.getValueAt(i, 3);

                String it = slno.toString();
                String si = item2.toString();
                int qt = Integer.parseInt(size2.toString());

                //MSfuntion.saledetails(m,it, si, qt);
                MSfuntion.saledetailsweb(m,it, si, qt);
                sc=0;
            }
        }catch(Exception e)
        {
        e.printStackTrace();
        }
    runt2=false;
       }
     t1.start();
     t2.start()
4

4 に答える 4

2

私にはスレッドの問題のようには聞こえません。データを両方のテーブルに書き込んだ後、書き込みをコミットしたり、データベース接続を解放したりしないようです。データベースへのデータの書き込み方法によっては、1 つのスレッドで動作する場合がありますが、複数のスレッドから実行する場合はそうではありません。初めて実行すると、最初のスレッドがデータベースをロックし、2 番目の書き込み用に作成されたスレッドは、最初のスレッドがロックを解放しなかったため、データを書き込むことができません。

もう 1 つ、誰かがボタンをクリックするたびに 2 つのスレッドを生成する代わりに、ExecutorServiceを使用する方がはるかに優れています。

于 2013-07-25T11:28:15.677 に答える
1

while ループで何をしようとしているのかわからないので、それらが必要だとは思いません。それにもかかわらず、2 番目の while は runt1 をブレーク条件として使用します。多分それはわざとじゃない

于 2013-07-25T11:26:45.237 に答える