Java线程基础

1.Java线程

线程,程序执行流的最小执行单位,经常容易和进程这个概念混淆。

2.Java线程生命周期

在这里插入图片描述

3.新建线程

java提供两种方式来创建线程,继承Thead类或实现Runnable接口,然后重写run()方法。一般建议使用实现Runnable接口的方式,因为Java是单继承,继承也是一种资源。

3.1 方式1:继承线程Thread创建线程

1.代码示例如下:

package yangyongfeng.highconcurrencedemo;

public class ThreadCreateTest {

	public static void main(String[] args) {

		ThreadTest1 threads[] = new ThreadTest1[3];
		for (int i = 0; i < 3; i++) {
			threads[i] = new ThreadTest1();
			threads[i].start();
		}

	}
	
	public static class ThreadTest1 extends Thread{
		
		public void run(){
			try {
				System.out.println(Thread.currentThread().getName() + " is running.");
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + " end.");
		}
	}

}

2.运行结果:
Thread-0 is running.
Thread-1 is running.
Thread-2 is running.
Thread-0 end.
Thread-1 end.
Thread-2 end.

3.2 方式2:实现Runnable接口创建线程

1.代码如下

package yangyongfeng.highconcurrencedemo;

import yangyongfeng.highconcurrencedemo.ThreadCreateTest.ThreadTest1;

public class ThreadCrearteByRunnableTest {

	public static void main(String[] args) {
		Thread threads[] = new Thread[3];
		
		for (int i = 0; i < 3; i++) {
			threads[i] = new Thread(new ThreadTest());
			threads[i].start();
		}

	}
	
	public static class ThreadTest implements Runnable{

		@Override
		public void run() {
			try {
				System.out.println(Thread.currentThread().getName() + " is running.");
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + " end.");
			
		}
		
	}

}

2.运行接果如下:
Thread-0 is running.
Thread-1 is running.
Thread-2 is running.
Thread-0 end.
Thread-1 end.
Thread-2 end.

线程中断

档一个线程进入休眠、等待、其他方式被阻塞是,我们可以将其中断运形。下面的代码我们在主线程中启动了一个新线程,新线程启动后进入休眠10s, 我们在主线程中中断测试线程的休眠

  1. 代码如下:
package yangyongfeng.highconcurrencedemo;

public class ThreadSleepInterruptTest {

	public static void main(String[] args) {
		Thread test = new Thread(new ThreadSleep());
		test.start();
		test.interrupt();	//线程休眠打断
	}

	public static class ThreadSleep implements Runnable{

		@Override
		public void run() {
			try {
				System.out.println(Thread.currentThread().getName() + " enter sleep.");
				Thread.sleep(100000);		//进入长时间休眠
			} catch (Exception e) {
				System.out.println(Thread.currentThread().getName() + " sleep is interrupt");
			}
			System.out.println(Thread.currentThread().getName() + " end.");
		}
	}
}

2.运行结果
Thread-0 enter sleep.
Thread-0 sleep is interrupt
Thread-0 end.
Thread-0 end.

线程同步

方式1:线程wait()和notify()

下面的程序中我们在主线程中创建了2个新线程,其中一个启动wait() 阻塞等待,另外线程启动后notify等待中的线程。
1.代码示例

package yangyongfeng.highconcurrencedemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ThreadWaitTest {
	public static Object syncObject = new Object();
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new ThreadWaitRunnable());
		Thread t2 = new Thread(new ThreadNotifyRunnalbe());
		t1.start();
		t2.start();

	}

	public static class ThreadWaitRunnable implements Runnable {

		public void run() {
			synchronized (syncObject) {		//线程等待前需获得对象锁
				System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " start.");
				try {
					System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " wait and blocked");
					syncObject.wait();

				} catch (InterruptedException e) {
					System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " is interrupted.");
				}
				System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " end.");
			}
		}

	}

	public static class ThreadNotifyRunnalbe implements Runnable {

		public void run() {

			synchronized (syncObject) { //线程notify()需获得对象同步锁,且需与被唤醒的线程使用同一对象
				System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " start and notify one thread.");
				syncObject.notify();
				
			}
			try {
				Thread.sleep(1000);
			} catch (Exception e) {

			}
			System.out.println(System.currentTimeMillis() + Thread.currentThread().getName() + " end.");
		}

	}
}

2.运行结果:
1581933012696Thread-0 start.
1581933012696Thread-0 wait and blocked
1581933012696Thread-1 start and notify one thread.
1581933012696Thread-0 end.
1581933013696Thread-1 end.

方式2:线程join()

下面测试用例用来说明join用法,在主线程中启动一个线程,然后调用join(),这样主线程等待测试线程完成后,才执行后续代码直至完成。
1.代码示例

package yangyongfeng.highconcurrencedemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ThreadJoinTest {
	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName() + " start.") ;
		Thread at = new Thread(new AddThread());
		at.start();
		try {
			at.join();
		} catch (InterruptedException e) {
			
		}
		System.out.println(Thread.currentThread().getName() + " end.") ;
	}
	
	public static class AddThread implements Runnable{
		public volatile static int i = 0;

		public void run() {
			System.out.println(Thread.currentThread().getName() + " start.") ;
			for (i = 0; i < 1000000; i++);
			System.out.println(Thread.currentThread().getName() + " end.") ;
		}
	}

}

  1. 运行结果
    main start.
    Thread-0 start.
    Thread-0 end.
    main end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值