/**
* 通过继承Thread类实现多线程
*/
public class MyThread extends Thread {
public MyThread() {
System.out.println("构造!调用线程名:"+Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("线程启动了!本线程名:"+getName());
for(int i=0;i<100;i++){
System.out.println(getName()+"++"+ i);
}
}
// 测试代码
public static void main(String[] args)
{
// 直接创建自定的继承类
new MyThread().start();
new MyThread().start();
}
}
/**
* 通过实现Runnable接口创建线程类
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程启动了!");
}
// 测试代码
public static void main(String[] args)
{
// 直接运行
new Thread(new MyRunnable()).start();
// 想获取当前线程的信息
Thread thread = new Thread(new MyRunnable());
thread.start();
System.out.println("线程启动了!线程的名字;"+thread.getName());
// 匿名内部类写法
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("匿名内部类线程启动了!");
}
}).start();
// JDK1.8 lambda写法
new Thread(() -> {
System.out.println("lambda写法匿名内部类线程启动了");
}).start();
}
}
/**
* 实现Callable接口配合Future创建线程
*/
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(5000);
System.out.println("子线程名:"+Thread.currentThread().getName());
return "返回值1";
}
// 测试代码
public static void main(String[] args)
{
MyCallable myCallable = new MyCallable();
// FutureTask能用来包装一个Callable或Runnable对象,因为它实现了Runnable接口,而且它能被传递到Executor进行执行
// RunnableFuture接口同时继承Future接口和Runnable接口,在执行run()方法后,可以通过Future访问执行结果,实现类是FutureTask
FutureTask<String> task = new FutureTask<String>(myCallable);
new Thread(task).start();
try {
//取消任务
//task.cancel(true);
//完成状态
//task.isDone();
//取消状态
//System.out.println("子线程的取消了吗:"+task.isCancelled());
System.out.println("子线程的返回值:"+task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
优点:
缺点:
优点:
缺点:
Callable方案(JDK1.5)可以理解为是Runnable的增强版,其关系如下:
区别如下:
提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
取消Future里关联的Callable任务
mayInterruptIfRunning入参:是否允许在线程运行时中断
返回Callable任务里call()方法的返回值
调用该方法将导致程序阻塞,必须等到子线程结束以后才会得到返回值
返回Callable任务里call()方法的返回值
该方法让程序最多阻塞timeout和unit指定的时间
如果经过指定时间后,Callable任务依然没有返回值,将会抛出TimeoutException异常
如果Callable任务正常完成前被取消,则返回true
如果Callable任务已经完成, 则返回true
当前还没有观点发布,欢迎您留下足迹!
Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程
SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It
Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。