没有main方法的Java多线程

时间:2015-12-07 09:59:01

标签: java multithreading

我是Java的新手。我有一个函数,我希望函数执行多线程的行为。问题是我将在没有main方法的情况下制作jar ..只是想知道我们可以有一个Java中的多线程函数没有具有main方法的类? 我有以下代码,我希望这个“myHandler”函数具有多线程行为,这样每当调用此函数时,不同的线程执行它...你能帮我这个代码执行多线程行为吗?谢谢

domain = credentials.get("domainName").toString();
project = credentials.get("project").toString();

2 个答案:

答案 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();

希望这会有所帮助(: