进程Process与线程Thread
一个进程可以有多个线程,如视频中同时有声音,图像。
一个cpu情况下,在同一时间还是执行一件事,只是切换的快。
默认主线程,gc线程。
线程创建
死亡后的线程不能再start。
继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
//假多线程
//myThread.run();
//真多线程
myThread.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
我在看代码---12
我在看代码---13
我在看代码---14
我在看代码---15
我在学习多线程---11
我在看代码---16
我在看代码---17
我在看代码---18
我在看代码---19
我在学习多线程---12
我在学习多线程---13
我在学习多线程---14
线程开启不一定立即执行,由cpu调度。
public class MyThread2 extends Thread {
private String url;
private String name;
public MyThread2(String url,String name){
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载完成"+name);
}
//下载器
static class WebDownloader{
public void downloader(String url,String name){
try {
//需导入Commons-io包
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("Io异常,downloader方法出现问题。");
}
}
}
public static void main(String[] args) {
MyThread2 t1 = new MyThread2("url","1.jpg");
MyThread2 t2 = new MyThread2("url","2.jpg");
MyThread2 t3 = new MyThread2("url","3.jpg");
t1.start();
t2.start();
t3.start();
}
}
实现Runnable接口(推荐)
java单继承,所以推荐实现接口。
而且可以多个Thread对象使用一个run。
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
//创建线程对象,通过线程对象来开启我们定义的线程
Thread thread = new Thread(myRunnable);
thread.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
我在学习多线程---15
我在看代码---6
我在学习多线程---16
我在看代码---7
我在学习多线程---17
我在看代码---8
我在学习多线程---18
我在看代码---9
并发问题
public class MyRunnable2 implements Runnable {
private int num = 10;
@Override
public void run() {
while (num > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + num--);
}
}
public static void main(String[] args) {
MyRunnable2 runnable2 = new MyRunnable2();
new Thread(runnable2,"小明").start();
new Thread(runnable2,"花花").start();
new Thread(runnable2,"刘某").start();
}
}
花花拿到了第2
刘某拿到了第3
刘某拿到了第1
小明拿到了第0
花花拿到了第1
龟兔赛跑
public class Race implements Runnable {
private static String winner;
@Override
public void run() {
for (int i = 0; i < 101; i++) {
String name = Thread.currentThread().getName();
boolean flag = gameOver(i);
if (flag){
break;
}
if ("兔子".equals(name)&&i%9==1){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name+"--跑了"+i+"步");
}
}
private boolean gameOver(int step){
if (winner!=null){
return true;
}else {
if (step>=100){
winner = Thread.currentThread(