2015-12-07 2 views
1

Я новичок в Java. У меня есть функция, где я хочу, чтобы функция выполняла многопоточное поведение. Проблема в том, что я буду делать банку без основного метода внутри нее. Просто хотел знать что мы можем иметь многопоточную функцию в Java без класса, имеющего основной метод? У меня есть следующий код, и я хочу, чтобы эта функция «myHandler» имела многопоточное поведение, так что всякий раз, когда эта функция вызывается, разные потоки выполняют ее ... Можете ли вы мне помочь, чтобы этот код выполнял многопоточное поведение? СпасибоМногопоточность Java без основного метода

public String myHandler(KinesisEvent kinesisEvent,Context context) 
{ 
    int singleRecord=0; 
    long starttime=System.currentTimeMillis(); 
    //LambdaLogger lambdaLogger=context.getLogger(); 
    for(KinesisEventRecord rec : kinesisEvent.getRecords()) 
    { 
     singleRecord=0; 
     System.out.println("Kinesis Record inside is:"+new String(rec.getKinesis().getData().array())); 
     //count++; 
     singleRecord++; 
     // System.out.println(new String(rec.getKinesis().getData().array())); 
    } 
    count=count+singleRecord; 
    long endtime=System.currentTimeMillis(); 
    long totaltime = endtime-starttime; 
    time=time+totaltime; 
    System.out.println("Time required to execute single Lambda function for "+singleRecord+" records is"+" :: "+totaltime+" milliseconds"); 
    System.out.println("Total time required to execute Lambda function for "+count+" records is"+" :: "+time+" milliseconds"); 
    return null; 
} 
+0

Положите его в 'Thread' – ChiefTwoPencils

+1

Да, вы можете церат класса, который порождает новые темы, и поместить этот класс в файле банка, который не имеет основного. метод. – aioobe

ответ

1

Я не уверен, что если это именно то, что вы хотите, но вы могли бы сделать что-то вроде этого:

public String myHandler(final KinesisEvent kinesisEvent, final Context context) 
{ 
    Thread thread = new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      int singleRecord=0; 
      long starttime=System.currentTimeMillis(); 
      //LambdaLogger lambdaLogger=context.getLogger(); 
      for(KinesisEventRecord rec : kinesisEvent.getRecords()) 
      { 
       singleRecord=0; 
       System.out.println("Kinesis Record inside is:"+new String(rec.getKinesis().getData().array())); 
       //count++; 
       singleRecord++; 
       // System.out.println(new String(rec.getKinesis().getData().array())); 
      } 
      count=count+singleRecord; 
      long endtime=System.currentTimeMillis(); 
      long totaltime = endtime-starttime; 
      time=time+totaltime; 
      System.out.println("Time required to execute single Lambda function for "+singleRecord+" records is"+" :: "+totaltime+" milliseconds"); 
      System.out.println("Total time required to execute Lambda function for "+count+" records is"+" :: "+time+" milliseconds"); 
     } 
    }); 
    thread.start(); 
} 

Этот код будет начать свой код в новом потоке после вызова метода, но любые параметры, которые вы хотите использовать в теме должны быть Декабре lared final будет отображаться в анонимной реализации Runnable.

Другим решением было бы создать новый класс и расширить Thread класс:

public class MyHandlerThread extends Thread { 
    KinesisEvent kinesisEvent; 
    Context context; 

    public MyHandlerThread(KinesisEvent kinesisEvent, Context context) { 
     super(); 
     this.kinesisEvent = kinesisEvent; 
     this.context = context; 
    } 

    @Override 
    public void run() { 
     int singleRecord = 0; 
     long starttime = System.currentTimeMillis(); 
     //LambdaLogger lambdaLogger=context.getLogger(); 
     for (KinesisEventRecord rec : kinesisEvent.getRecords()) { 
      singleRecord = 0; 
      System.out.println("Kinesis Record inside is:" + new String(rec.getKinesis().getData().array())); 
      //count++; 
      singleRecord++; 
      // System.out.println(new String(rec.getKinesis().getData().array())); 
     } 
     count = count + singleRecord; 
     long endtime = System.currentTimeMillis(); 
     long totaltime = endtime - starttime; 
     time = time + totaltime; 
     System.out.println("Time required to execute single Lambda function for " + singleRecord + " records is" + " :: " + totaltime + " milliseconds"); 
     System.out.println("Total time required to execute Lambda function for " + count + " records is" + " :: " + time + " milliseconds"); 
    } 

} 

Для того, чтобы начать это как нить вы должны создать экземпляр объекта и вызвать его метод запуска.

MyHandlerThread thread = new MyHandlerThread(param1, param2); 
thread.start(); 

Надеется, что это помогает (:

+0

Спасибо, что помогли мне с решением ... Я пробовал все подходы мульти i-threading..Но я хочу знать, что всякий раз, когда я выполняю код как однопоточный, он работает намного быстрее, тогда как всякий раз, когда я делаю этот код многопоточным, он дает мне медленную производительность ... Что я могу сделать так, чтобы всякий раз, когда я выполнить код с многопоточным подходом, он работает быстрее? – Akki

+0

@Akki Хорошо ... улучшения производительности с использованием потоков зависят от многих вещей. Например, на каком процессоре работает ваш код и сколько потоков вы используете. Возможно, это может помочь вам немного: [Производительность с несколькими потоками] (http://stackoverflow.com/questions/15292626/does-multi-threading-improve-performance-how) – scsere

+0

Спасибо за обмен информацией ... что было довольно полезный и понятный .. Большое спасибо – Akki

1

Если метод всегда должен быть выполнен в отдельном потоке, вы можете создать тему и назовите код из этого потока по следующим образом:

public String myHandler(final KinesisEvent kinesisEvent, final Context context) { 
     new Thread(new Runnable() { 
      public void run() { 
       int singleRecord = 0; 
       long starttime = System.currentTimeMillis(); 
       //LambdaLogger lambdaLogger=context.getLogger(); 
       for (KinesisEventRecord rec : kinesisEvent.getRecords()) { 
        singleRecord = 0; 
        System.out.println("Kinesis Record inside is:" + new String(rec.getKinesis().getData().array())); 
        //count++; 
        singleRecord++; 
        // System.out.println(new String(rec.getKinesis().getData().array())); 
       } 
       count = count + singleRecord; 
       long endtime = System.currentTimeMillis(); 
       long totaltime = endtime - starttime; 
       time = time + totaltime; 
       System.out.println("Time required to execute single Lambda function for " + singleRecord + " records is" + " :: " + totaltime + " milliseconds"); 
       System.out.println("Total time required to execute Lambda function for " + count + " records is" + " :: " + time + " milliseconds"); 
       return null; 
      } 
     }).start(); 
    } 
+0

Спасибо, что помогли мне с решением ... Я пробовал все подходы многопоточности. Но я хочу знать, что всякий раз, когда я выполняю код как однопоточный, он работает намного быстрее, тогда как всякий раз, когда я делаю этот код как многопоточный он дает мне медленную производительность ... Что я могу сделать так, что всякий раз, когда я выполняю код с многопоточным подходом, он работает быстрее? – Akki

Смежные вопросы