Multi-Thread In Java


Hôm nay mình sẻ hướng dẫn các bạn 3 cách để tạo 1 main chạy với multi-thread.

Cách 1 : Class MyThread Implement interface runnable như sau :

package demo1;

public class MyThread implements Runnable{
	private final MyWork myWork;
	private final int number;

	public MyThread(MyWork myWork, int number) {
		super();
		this.myWork = myWork;
		this.number = number;
	}

	@Override
	public void run() {
		for (int i = 0; i < number; i++) {
			String nameThread = Thread.currentThread().getName();
			System.out.println(nameThread + " " + i);
			myWork.pause(Math.random());
		}

	}

}

Class MyWork.java của chúng ta như sau:

package demo1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyWork {
	public MyWork() {
		ExecutorService listTask = Executors.newFixedThreadPool(100);

		listTask.execute(new MyThread(this, 10));
		listTask.execute(new MyThread(this, 5));
		listTask.execute(new MyThread(this, 2));

		listTask.shutdown();
	}

	public void pause(double seconds){
		try {
			Thread.sleep(Math.round(seconds));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new MyWork();
	}
}

Kết quả sau khi run :
d1

Cách thứ 2 : Chúng ta sẻ implement interface Runnable trực tiếp trên Class MyWork của chúng ta

package demo2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyWork implements Runnable{
	private final int number;

	public MyWork(int number) {
		super();
		this.number = number;
		ExecutorService taskList = Executors.newFixedThreadPool(10);

		taskList.execute(this);
		taskList.execute(this);
		taskList.execute(this);

		taskList.shutdown();
	}

	private void pause(double seconds){
		try {
			Thread.sleep(Math.round(seconds));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		for (int i = 0; i < number; i++) {
			String nameThread = Thread.currentThread().getName();
			System.out.println(nameThread + " " + i);
			pause(Math.random());
		}

	}

	public static void main(String[] args) {
		new MyWork(5);
	}

}

d1

Cách 3 : Chúng ta sẻ tạo bằng cách hiện thực 1 inner class in class MyWork của chúng ta

package demo3;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyWork {
	public MyWork() {
		ExecutorService taskList = Executors.newFixedThreadPool(10);

		taskList.execute(new MyThread(10));
		taskList.execute(new MyThread(5));
		taskList.execute(new MyThread(2));

		taskList.shutdown();

	}

	public static void main(String[] args) {
		new MyWork();
	}

	private class MyThread implements Runnable{
		private final int number;

		public MyThread(int number) {
			super();
			this.number = number;
		}

		private void pause(double seconds){
			try {
				Thread.sleep(Math.round(seconds));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		@Override
		public void run() {
			for (int i = 0; i < number; i++) {
				String nameThread = Thread.currentThread().getName();
				System.out.println(nameThread + " " + i);
				pause(Math.random());
			}

		}

	}
}

Kết quả khi run như sau :
d1

OK đó là 3 cách để tạo ra một chương trình với multi-thread.

Sau khi có 3 cách tạo ra 1 chương trình với multi-thread các bạn củng đặt ra cho bản thân mình 1 câu hỏi. tại sao lại có nhiều cách để tạo ra 1 chương trình multi-thread như vậy . Vậy chúng ta nên chọn cách nào.

Sau đây mình sẻ nêu ra 1 vài ưu điểm và nhược điểm của các cách tạo trên :

Cách 1

– Có thể truyền nhiều loại tham só khi Thread run.

-Kho có thể truy cập vào main class (duy nhất chỉ có những method public)

-Không phải lo lắng cho việc race conditions.

Cách 2:

– Có thể dễ dàng cho việc truy cập các attribute vs method in main class

-Khổng thể truyền nhiều loại tham số , chỉ có thể mặc định số tham số khi truyền vào.

-Phải quan tâm đến vấn đề race coditions

Cách 3:

– Có thể dể dàng truy cập attributes vs method trong main class

-Có thể truyền nhiều loại tham số khi thread run

-Phải quan tâm đến vấn đề race conditions.

Hy vọng bài viết này hữu ích đến các bạn ^^!.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: