多任务实质上是同一时间只做一件事,多个任务交替执行
多线程是同时做
一个进程中可以有多个线程
很多线程是模拟出来的,真正的多线程是指有多个cpu,即多核
线程的运行由调度器安排调度,先后顺序不能人为干预
线程创建Thread class
自定义线程类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
package com.yhk.someThread.demo1;
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//线程开启不一定立即执行,由cpu调度执行
public class TestThread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码--"+i);
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start开启线程
testThread1.start();
for(int i=0;i<20;i++){
System.out.println("我在学习多线程--"+i);
}
}
}
Runnable接口
package com.yhk.someThread.demo1;
//创建线程方式二:实现runnable接口,重写run方法
//执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码--"+i);
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
TestThread3 testThread3 = new TestThread3();
new Thread(testThread3).start();
for(int i=0;i< 1000;i++){
System.out.println("我在学习多线程--"+i);
}
}
}
与第一种创建方式的差别,一个是继承类,一个是实现接口
在启动方式上面不同
Runnable是推荐使用的,可以避免单继承的局限性,方便同一个对象被多个线程使用
Thread.sleep(200);//让线程延迟
//龟兔赛跑
package com.yhk.someThread.demo1;
public class Run implements Runnable{
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
boolean flag=gameOver(i);
//一共100步,在第101步结束,返回
if(flag){
break;
}
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
}
}
private boolean gameOver(int steps){
if(winner!=null){
return true;
}{
if(steps>=100){
winner = Thread.currentThread().getName();
System.out.println("winner is"+winner);
}
}
return false;
}
public static void main(String[] args) {
Run race=new Run();
//创建归途连个进程
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
Callable接口(了解)
//4各步骤
TestCallable t1 = new TestCallable();
//创建执行服务
ExecutorService ser= Executors.newFixedThreadPool(3);
//提交执行
Future r1=ser.submit(t1);
Future r2=ser.submit(t2);
Future r3=ser.submit(t3);
//获取结果
boolean rs1=r1.get();
boolean rs2=r2.get();
boolean rs3=r3.get();
//关闭服务
ser.shutdown();
静态代理 


