文章目录
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, 我们在主线程中中断测试线程的休眠
- 代码如下:
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.") ;
}
}
}
- 运行结果
main start.
Thread-0 start.
Thread-0 end.
main end.