java的多线程是抢占式的。
java默认有两条线程:一条主线程,一条垃圾回收线程
创建线程的两种方式:
方式一继承Thread类。重写run方法
方式二实现Runnable接口
方式一案例
public class MyThread extends Thread{
public MyThread() {
}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"执行");
}
}
}
public class Test {
public static void main(String[] args) {
new MyThread("线程一").start();
new MyThread("线程二").start();
}
}
方式二案例
public class Test2 {
public static void main(String[] args) {
new Thread(new MyThread(),"线程1").start();
new Thread(new MyThread(),"线程2").start();
}
}
class MyRunnale implements Runnable{
@Override
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"执行");
}
}
}
实现Runnale使用匿名内部类方式
public class Test3 {
public static void main(String[] args) {
new Thread(()->{
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"执行");
}
},"线程1").start();
new Thread(()->{
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"执行");
}
},"线程2").start();
}
}
使用接口的方式还有一种好处,解耦,可以多次利用
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"执行");
}
}
};
new Thread(runnable,"线程1").start();
new Thread(runnable,"线程2").start();
new Thread(runnable,"线程3").start();
new Thread(runnable,"线程4").start();
}
另外线程池只能接收Runnable线程或者Callable线程。
Callable线程有返回值,一般用不上



