Java多线程线程基础线程间的共享和协作

Posted moxi-moxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程线程基础线程间的共享和协作相关的知识,希望对你有一定的参考价值。

通过JVM给我们的入口,可以知道运行期间有几个线程:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : threadInfos){
System.out.println(threadInfo);
}


一、启动线程的三种方式:
1.继承 Thread
2.实现Runnable接口
3.实现Callable接口(有返回值)

public class NewThread {

private static class UseRun implements Runnable{

@Override
public void run() {
System.out.println("I am implements Runnable");
}

}

private static class UseCall implements Callable<String>{

@Override
public String call() throws Exception {
System.out.println("I am implements Callable");
return "CallResult";
}
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
UseRun useRun = new UseRun();
//Runnable接口能够直接作为Thread的构造参数
Thread thread1 = new Thread(useRun);
UseCall useCall = new UseCall();
//Callable接口不能作为Thread的构造参数
//需要通过FutureTask类的转换,将其转换为Runnable接口
//因为FutureTask实现了Runnable接口
FutureTask<String> futureTask = new FutureTask<>(useCall);
Thread thread2 = new Thread(futureTask);
thread2.start();
//通过futureTask的get方法得到返回值
     //get方法是一个阻塞方法,一直等到有返回值后才会继续往下走
System.out.println(futureTask.get());
}

}


二、停止线程的三种方式:
1.自然执行完成死亡
2.在没有对异常进行处理时抛出异常会中止线程
3.早期stop()等因为过于强势,无法保证线程资源释放,容易导致死锁的问题‘
4.interrupt():中断一个线程,将中断标志位置为true
  isinterrupted():判定当前线程是否处于中断状态
  static方法interrupted():判定当前线程是否处于中断状态,同时将中断标志位改为False,这是2和3的最主要的区别
由于Java中线程是协作式的,interrupt方法只会通知线程应该中断了,并不会强制中断
目的:为了让每个线程有时间释放占有的资源

以上是关于Java多线程线程基础线程间的共享和协作的主要内容,如果未能解决你的问题,请参考以下文章

java基础入门-多线程同步浅析-以银行转账为样例

Java 线程系列Java线程之间的共享和协作

java基础之多线程

Java基础之多线程

java基础知识总结--多线程

Java线程基础知识(状态共享与协作)