Skip to content

Instantly share code, notes, and snippets.

@phg1024
Created April 6, 2017 04:07
Show Gist options
  • Save phg1024/99bb50a004e0d4a10397cc1f853cab9c to your computer and use it in GitHub Desktop.
Save phg1024/99bb50a004e0d4a10397cc1f853cab9c to your computer and use it in GitHub Desktop.

Revisions

  1. phg1024 created this gist Apr 6, 2017.
    91 changes: 91 additions & 0 deletions timedtask.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,91 @@
    import java.util.Random;
    import java.util.concurrent.*;
    import java.util.Vector;

    public class Main {
    static class TimeConsumingTask implements Runnable {
    public Vector<Integer> results = new Vector<>();

    @Override
    public void run() {
    System.out.println("Task thread: " + Thread.currentThread().getName());
    System.out.println("Running time consuming task: " + System.currentTimeMillis());

    try {
    doSomething(0);
    } catch(Exception e) {
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Exception caught. Printing stack trace ...");
    e.printStackTrace();
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Exit.");
    return;
    }
    }

    private int doSomething(int depth) throws Exception {
    final long total_ints = 1<<20;
    if(depth == 5) {
    long numbers_to_gen = total_ints / (1<<depth);
    int sum = 0;
    for(int j=0;j<numbers_to_gen;++j) {
    // Check if the thread is interrupted frequently
    if(Thread.currentThread().isInterrupted()) throw new Exception("Compute task interrupted.");
    sum += (new Random()).nextInt(2);
    }
    return sum;
    } else if(depth == 0) {
    for(int i=0;i<100;++i) {
    int sum = doSomething(depth+1) + doSomething(depth+1);
    results.add(sum);
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Finished " + String.valueOf(i) + " / 100 @ " + System.currentTimeMillis());
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Current sum = " + sum);
    }
    return 0;
    } else {
    return doSomething(depth+1) + doSomething(depth+1);
    }
    }
    }

    public static void main(String[] args) {
    System.out.println("Main thread: " + Thread.currentThread().getName());

    long time_limit = (new Random()).nextInt(1000) + 500;
    System.out.println("Timer limit: " + time_limit);

    TimeConsumingTask compute_task = new TimeConsumingTask();
    Thread compute_thread = new Thread(compute_task);

    System.out.println("Begin: " + System.currentTimeMillis());
    long start_time = System.currentTimeMillis();
    compute_thread.start();

    try {
    // Don't over sleep
    while((System.currentTimeMillis() - start_time) < time_limit * 0.98) {
    // Sleep for some time
    long elapsed_time = System.currentTimeMillis() - start_time;
    long remaining_time = time_limit - elapsed_time;
    long sleep_time = (long)Math.min(time_limit * 0.05, remaining_time * 0.9);
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Elapsed time: " + elapsed_time + ", Sleep for " + sleep_time + " ms");
    Thread.currentThread().sleep(sleep_time);
    }
    compute_thread.interrupt();
    compute_thread.join();
    } catch(InterruptedException e){
    e.printStackTrace();
    } finally {

    }
    long end_time = System.currentTimeMillis();
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Compute task ended: " + end_time);
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Total time used: " + (end_time - start_time));

    System.out.println("[Thread " + Thread.currentThread().getName() + "] Finding the maximum sum ...");
    int maxval = 0;
    for(int i=0;i<compute_task.results.size();++i) {
    maxval = Math.max(maxval, compute_task.results.get(i));
    }
    System.out.println("[Thread " + Thread.currentThread().getName() + "] Max sum = " + maxval);
    System.exit(0);
    }
    }