java多线程创建的三种方式

版权声明:不要随便复制~~ 技术更新有些东西也会相应更新 https://blog.csdn.net/chuxin_mm/article/details/84966339

如果用加锁的多线程,最好使用redis的分布式锁代替;(加锁的多线程非常影响性能,可能会导致服务器卡死,宕机)

1. 继承Thread 无返回值

第一步: 继承Thread
public class Person extends Thread {
	// 重写线程中的run方法
	@Override
	public void run() {
		// 线程休眠,表示该代码1秒钟执行一次
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		for (int i = 1; i < 11; i++) {
			// 获取线程名称: getName()
			System.out.println(getName() + ":  该代码需要被多线程执行" + i + "__" + new Date());

		}
		// 线程礼让,暂停当前正在执行的线程对象,并执行其他线程(让多个线程执行更加和谐)
		Thread.yield();
	}
}

第二步: 
// 多线程运行程序
public static void main(String[] args) {

	Person p1 = new Person();
	Person p2 = new Person();
	Person p3 = new Person();

	// 设置线程名称
	p1.setName("线程1");
	p2.setName("线程2");
	p3.setName("主线程");
		
	// 设置线程优先级,最大优先级为10,最小优先级为1,默认为5
	// 线程优先级高仅仅表示线程获取的cpu时间片的几率高
	p1.setPriority(10);
	p2.setPriority(1);

	// 后台(守护)线程,必须在线程启动前调用
	// 当3线程死去之后,所有线程停止
	 p1.setDaemon(true);
	 p2.setDaemon(true);
	 p3.setDaemon(false);

	// 中断线程
	// p1.stop();
	// p1.interrupt();

	// 调用start()方法,就是先启动线程再调用run方法 (如果直接调用run()方法,其实就相当于普通的方法调用)
	p1.start();
	try {
		// 等待该线程终止,再执行2、3线程
		p1.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	p2.start();
	p3.start();
	try {
		Thread.sleep(100);
		p3.interrupt();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	// Thread.currentThread().getName()
	// 获取main方法所在线程的名称
	System.out.println(Thread.currentThread().getName());// main

	// 获取线程优先级(默认为5)
	int priority = p1.getPriority();
	int priority2 = p2.getPriority();
	System.out.println(priority);
	System.out.println(priority2);
}






2. 实现Runnable 无返回值

第一步: 实现Runnable接口
public class Person implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+":  "+i);
		}
	}
}

第二步:
public static void main(String[] args) {
	Person person = new Person();
	// 创建2个线程对象
	Thread t1 = new Thread(person,"线程1");
	Thread t2 = new Thread(person,"线程2");

	t1.start();
	t2.start();
}


3. 实现Callable<V>  有返回值

第一步: 实现Callable
/**
 * 使用多线程进行求和, 从1加到任意数字的运算
 * 
 * @author wangqinmin
 *
 */
public class MyCallable implements Callable<Integer> {
	private int number;
	public MyCallable(int number) { this.number = number;}

	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (int i = 0; i <= number; i++) {
			sum += i;
		}
		return sum;
	}
}

第二步: 
public static void main(String[] args) throws InterruptedException, ExecutionException {
	// 创建带有2个线程的线程池
	ExecutorService pool = Executors.newFixedThreadPool(2);
	
    // 多线程同时计算两个
	Future<Integer> f1 = pool.submit(new MyCallable(100));
	Future<Integer> f2 = pool.submit(new MyCallable(200));
	
	Integer i1 = f1.get();
	Integer i2 = f2.get();
	
	System.out.println(i1);
	System.out.println(i2);
	
}

猜你喜欢

转载自blog.csdn.net/chuxin_mm/article/details/84966339