it-swarm.dev

Java - إنشاء سلسلة رسائل جديدة

أنا جديد على المواضيع. أردت إنشاء وظيفة بسيطة تعمل بشكل منفصل عن الخيط الرئيسي. ولكن لا يبدو أن العمل. أود فقط إنشاء سلسلة رسائل جديدة والقيام ببعض الأشياء هناك بشكل مستقل عما يحدث في سلسلة الرسائل الرئيسية. قد يبدو هذا الرمز غريبًا ، لكن ليس لديّ خبرة كبيرة في الترابط حتى الآن. هل يمكن أن توضح لي ما هو الخطأ في هذا؟

  public static void main(String args[]){
      test z=new test();

      z.setBackground(Color.white);

      frame=new JFrame();
      frame.setSize(500,500);
      frame.add(z);
      frame.addKeyListener(z);
      frame.setVisible(true);

      one=new Thread(){
          public void run() {
              one.start();
              try{
                  System.out.println("Does it work?");
                  Thread.sleep(1000);
                  System.out.println("Nope, it doesnt...again.");
              } catch(InterruptedException v){System.out.println(v);}
          }
      };
  }
44
Matt Martin

تقوم بالاتصال بالطريقة one.start() في طريقة run من سلسلة الرسائل. ولكن لن يتم استدعاء الأسلوب run إلا عند بدء تشغيل سلسلة الرسائل بالفعل. افعل ذلك بدلاً من ذلك:

one = new Thread() {
    public void run() {
        try {
            System.out.println("Does it work?");

            Thread.sleep(1000);

            System.out.println("Nope, it doesnt...again.");
        } catch(InterruptedException v) {
            System.out.println(v);
        }
    }  
};

one.start();
90
stinepike

يمكنك أن تفعل مثل:

    Thread t1 = new Thread(new Runnable() {
    public void run()
    {
         // code goes here.
    }});  
    t1.start();
16
Bin Feng

كان الهدف هو كتابة رمز للاتصال بـ start () و join () في مكان واحد. معلمة الفئة المجهولة هي وظيفة مجهولة. new Thread(() ->{})

new Thread(() ->{
        System.out.println("Does it work?");
        Thread.sleep(1000);
        System.out.println("Nope, it doesnt...again.");       
}){{start();}}.join();

في نص فئة مجهولة لديه كتلة مثيل يستدعي start (). والنتيجة هي مثيل جديد من مؤشر ترابط الفئة ، والذي يسمى join ().

10
Максим Казаченко

تحتاج إلى القيام بأمرين:

  • بدء الخيط
  • انتظر حتى ينتهي الخيط (يموت) قبل المتابعة

أي

one.start();
one.join();

إذا لم تقم بذلك start() ، فلن يحدث شيء - إنشاء مؤشر ترابط لا تنفيذ.

إذا لم تقم بذلك join) ، فقد ينتهي مؤشر الترابط الرئيسي الخاص بك وينتهي ويخرج البرنامج بالكامل قبل تم جدولة تنفيذ سلسلة الرسائل الأخرى. إنه غير محدد سواء كان يعمل أم لا إذا لم تنضم إليه. قد يتم تشغيل الخيط الجديد عادة ، لكن قد لا يعمل في بعض الأحيان. الأفضل أن تكون متأكدا.

7
Bohemian

طريقة run () تسمى start () . هذا يحدث تلقائيا. تحتاج فقط إلى الاتصال start () . للحصول على برنامج تعليمي كامل حول إنشاء مؤشرات الترابط والاتصال بها ، راجع مدونتي http://preciselyconcise.com/Java/concurrency/a_concurrency.php

2
Sai Sunder

إذا كنت تريد إنشاء مؤشر ترابط إضافي ، في الحالة أعلاه ، يجب عليك تكرار الكود داخل طريقة التشغيل أو على الأقل تكرار استدعاء بعض الأساليب بداخله.

جرب هذا الأمر ، والذي سيساعدك على الاتصال كلما احتجت إليه. سيكون مفيدًا عندما تحتاج إلى تنفيذ شوطك أكثر من مرة ومن مكان آخر.

class A extends Thread {
    public void run() {
             //Code you want to get executed seperately then main thread.       
    }
     }

الفئة الرئيسية

A obj1 = new A();
obj1.start();

A obj2 = new A();
obj2.start();
2
Jayesh

هناك عدة طرق لإنشاء سلسلة رسائل

  1. عن طريق تمديد الموضوع الطبقة> 5
  2. عن طريق تنفيذ Runnable واجهة -> 5
  3. باستخدام ExecutorService inteface -> = 8
1
bshr

طريقة أبسط يمكن أن تكون:

new Thread(YourSampleClass).start();    
0
Mehdi

نظرًا لإغلاق سؤال جديد للتو ضد هذا: يجب ألا تنشئ Thread كائنات بنفسك. إليك طريقة أخرى للقيام بذلك:

public void method() {
    Executors.newSingleThreadExecutor().submit(() -> {
        // yourCode
    });
}

ربما يجب عليك الاحتفاظ بخدمة المنفذ بين المكالمات بالرغم من ذلك.

0
daniu

من فضلك جرب هذا. سوف تفهم كل شيء بشكل كامل بعد أن نلقي نظرة على حل بلدي.

هناك طريقتان فقط لإنشاء سلاسل الرسائل في Java

مع تنفذ Runnable

class One implements Runnable {
@Override
public void run() {
    System.out.println("Running thread 1 ... ");
}

مع يمتد الموضوع

class Two extends Thread {
@Override
public void run() {
    System.out.println("Running thread 2 ... ");
}

صفك الرئيسي هنا

public class ExampleMain {
public static void main(String[] args) {

    One demo1 = new One();
    Thread t1 = new Thread(demo1);
    t1.start();

    Two demo2 = new Two();
    Thread t2 = new Thread(demo2);
    t2.start();
}

}

0
Cristian Babarusi