我是Java的新手。我有一个函数,我希望函数执行多线程的行为。问题是我将在没有main方法的情况下制作jar ..只是想知道我们可以有一个Java中的多线程函数没有具有main方法的类? 我有以下代码,我希望这个“myHandler”函数具有多线程行为,这样每当调用此函数时,不同的线程执行它...你能帮我这个代码执行多线程行为吗?谢谢
domain = credentials.get("domainName").toString();
project = credentials.get("project").toString();
答案 0 :(得分:1)
如果方法应始终在单独的线程中执行,则可以创建一个Thread,并通过以下方式从该线程调用您的代码:
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();
}
答案 1 :(得分: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();
}
一旦调用该方法,此代码将在新线程中启动您的代码,但必须在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");
}
}
为了将其作为线程启动,您必须创建对象的实例并调用其start方法。
MyHandlerThread thread = new MyHandlerThread(param1, param2);
thread.start();
希望这会有所帮助(: