[TOC]
不能直接调用线程中的run()方法,要调用线程的start()函数,才能实现多线程
一个线程只能启动一次,要不然就会报错误IllegalThreadStateException();
实例:
class MyThread extends Thread{
private String title;
public MyThread(String title){
this.title=title;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(this.title+"i的值是"+i);
}
}
}
Thread runable1=new Thread(new MyThread_R("线程R1"));
runable1.start();利用lambda表达式来创建线程,在以后的开发对于多线程的实现,优先考虑的就是Runable接口的实现,
for(int x=0;x<3;x++){
String title="线程对象-"+x;
new Thread(()->{
for(int y=0;y<10;y++){
System.out.println( title+"lambda表达式"+y);
}
}).start();
}使用Runable是最方便的,可以避免单继承的局限,也可以更好的对功能进行扩充
但是从结构上来看,之前继承Thread的时候,还是实现Runable接口中的run()方法
通过 Thread 类的构造方法传递了一个 Runnable 接口对象的时候,那么该接口对象将被 Thread 类中的 target 属性所保存,在 start() 方法执行的时候会调用Thread类中的 run() 方法,而这个 run() 方法去调用 Runnable 接口子类被覆写过的 run() 方法。
多线程开发的本质上是多个线程可以进行同一资源的抢占
public class Thread implements Runnable 

Runable接口有一个问题,就是线程结束之后无法获取一个返回值,jdk1.5之后就提出了java.util.concurrent.Callable,就解决了这一问题
Callable定义的时候可以设置一个泛型,此泛型的类型就是返回数据的类型,这样的好处就是 可以避免一些安全隐患
1、Runable是在jdk1.0的时候提出的多线程的实现接口,而Callable实在jdk1.5之后提出的
2、java.long.Runable接口中只提供了一个run()方法,并且没有返回值,就无法判断该线程是否已经结束
3、java.util.concurrent.Callable接口提供了call()方法,可以有返回值