代码链接:https://download.csdn.net/download/qq_52354698/86402455?spm=1001.2014.3001.5501
为完成特定任务、用某种语言编写的一组指令集合
单线程:同一个时刻,只允许执行一个线程
多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口
并发:同一个时刻,多个任务交替执行,单核cpu实现的多任务就是并发(一个cpu的电脑,同时打开了qq和迅雷,该cpu在qq和迅雷之间不断切换执行)
并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行
- 编写程序,开启一个线程,该线程每隔一秒。在控制台输出“喵喵,我是小猫咪!”
- 对上题改进:当输出80次后,结束线程
package com.qdu.threaduse;
/**
* @author dell
* @version 1.0
*/
public class Thread01 {
public static void main(String[] args) {
Cat cat = new Cat();
//启动线程
cat.start();
}
}
//当一个类继承了Thread类,该类就可以看做线程使用
//我们会重写run方法,写入自己的业务代码
//run方法是Thread类实现了Runnable接口的run方法
class Cat extends Thread {
int times = 0;
//重写run方法,写入自己的逻辑
@Override
public void run() {
while (true) {
System.out.println("喵喵,我是小猫咪!" + times);
//输出后,让该线程休眠1秒,sleep单位是毫秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
times++;
//循环退出后,线程也就随之结束
if (times == 80) {
break;
}
}
}
}
每隔1秒,在控制台输出“Hi!”,输出10次后,自动退出
package com.qdu.threaduse;
/**
* @author dell
* @version 1.0
*/
public class Thread02 {
public static void main(String[] args) {
Dog dog = new Dog();
//创建一个Thread对象,把dog对象(实现Runnable),放入Thread
Thread thread = new Thread(dog);
thread.start();
}
}
class Dog implements Runnable {
int count = 0;
@Override
public void run() {
while (true){
System.out.println("Hi!" + (++ count) + " " + Thread.currentThread().getName());
if (count == 10) break;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
创建两个线程,一个线程每隔1秒输出“hello,world”,输出10次,退出;另一个线程每隔1秒输出“hi!”,输出5次退出。
package com.qdu.threaduse;
/**
* @author dell
* @version 1.0
*/
public class Thread03 {
public static void main(String[] args) {
T1 t1 = new T1();
T2 t2 = new T2();
Thread thread = new Thread(t1);
Thread thread1 = new Thread(t2);
thread.start();
thread1.start();
}
}
class T1 implements Runnable {
int count = 0;
@Override
public void run() {
while (true) {
System.out.println("hello,world" + (++count));
if (count == 10) break;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
class T2 implements Runnable {
int count = 0;
@Override
public void run() {
while (true) {
System.out.println("hi!" + (++count));
if (count == 5) break;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
T3 t3 = new T3("hello");
Thread thread1 = new Thread(t3);
Thread thread2 = new Thread(t3);
thread1.start();
thread2.start();
package com.qdu.ticket;
/**
* @author dell
* @version 1.0
*/
public class SellTicket {
public static void main(String[] args) {
SellTicket01 sellTicket01 = new SellTicket01();
SellTicket01 sellTicket02 = new SellTicket01();
SellTicket01 sellTicket03 = new SellTicket01();
sellTicket01.start();
sellTicket02.start();
sellTicket03.start();
}
}
class SellTicket01 extends Thread {
private static int ticketNum = 100;//让多个线程共享
@Override
public void run() {
while (true) {
if (ticketNum <= 0) {
System.out.println("售票结束...");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
}
}
会出现少卖、多买,等不同步的问题
package com.qdu.exit_;
/**
* @author dell
* @version 1.0
*/
public class ThreadExit {
public static void main(String[] args) throws InterruptedException {
T t = new T();
t.start();
Thread.sleep(1000 * 10);
t.setLoop(false);
}
}
class T extends Thread {
private int count = 0;
private boolean loop = true;
@Override
public void run() {
while (loop) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("T 运行中..." + (++count));
}
}
public void setLoop(boolean flag) {
loop = flag;
}
}
xxx.setDaemon(true);
synchronized (对象) {
//需要被同步代码
}
public synchronized void m(String name) {
//需要被同步的代码
}
package com.qdu.syn;
/**
* @author dell
* @version 1.0
*/
public class SellTicket {
public static void main(String[] args) {
// SellTicket01 sellTicket01 = new SellTicket01();
// SellTicket01 sellTicket02 = new SellTicket01();
// SellTicket01 sellTicket03 = new SellTicket01();
//
// sellTicket01.start();
// sellTicket02.start();
// sellTicket03.start();
SellTicket03 sellTicket03 = new SellTicket03();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
}
}
class SellTicket03 implements Runnable {
private static int ticketNum = 100;//让多个线程共享
private boolean loop = true;
public synchronized void sell() {//同步方法
if (ticketNum <= 0) {
System.out.println("售票结束...");
loop = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
@Override
public void run() {
while (loop) {
sell();
}
}
}
class SellTicket01 extends Thread {
private static int ticketNum = 100;//让多个线程共享
@Override
public void run() {
while (true) {
if (ticketNum <= 0) {
System.out.println("售票结束...");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
}
}
class SellTicket02 implements Runnable {
private static int ticketNum = 100;//让多个线程共享
@Override
public void run() {
while (true) {
if (ticketNum <= 0) {
System.out.println("售票结束...");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
}
}
public synchronized void sell() {
if (ticketNum <= 0) {
System.out.println("售票结束...");
loop = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
public /*synchronized*/ void sell() {
synchronized (this) {
if (ticketNum <= 0) {
System.out.println("售票结束...");
loop = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + ",剩余票数 " + (--ticketNum));
}
}
多个线程都占用了对方的锁资源,但不肯想让,导致了死锁,在编程中一定要避免死锁的发生。
妈妈:你先完成作业,才让你玩手机
小明:你先让我玩手机,我再写作业