Thread创建多线程步骤:
- 多线程的创建:方式一:继承Thread类
- 1.创建一个继承于Thread类的子类
- 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
- 3.创建Thread类的子类对象
- 4.通过此对象调用start()方法
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest extends Thread {
//2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
@Override
public void run() {
//遍历一百以内的所有偶数
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
}
public class MyThread {
public static void main(String[] args) {
// 3.创建Thread类的子类对象
MyThreadTest myThreadTest = new MyThreadTest();
//4.通过此对象调用start()方法,启动子线程
myThreadTest.start();
}
}
主线程继续,cpu随机切换执行父线程与子线程
package com.com.sun.test;
/**
* @author sun
* @date 2021/6/22 - 9:00
*/
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest1 extends Thread {
//2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
@Override
public void run() {
//遍历一百以内的所有偶数
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
}
public class MyThread1 {
public static void main(String[] args) {
// 3.创建Thread类的子类对象
MyThreadTest myThreadTest = new MyThreadTest();
//4.通过此对象调用start()方法,启动当前线程,调用当前线程的run方法
myThreadTest.start();
//问题1:调用子线程只能通过start()方法,启动子线程,不可以直接调用run方法
//myThreadTest.run();错误
//问题二:不能多次调用start()方法,一个对象只能调用一次start()方法
//myThreadTest.start();
//myThreadTest.start();错误
//正确做法:
// 需要多次调用子线程,需要多次创建对象
/* MyThreadTest myThreadTest1 = new MyThreadTest();
MyThreadTest myThreadTest2 = new MyThreadTest();
myThreadTest1.start();
myThreadTest2.start();*/
//主线程继续,cpu随机切换执行父线程与子线程
for (int i=0;i<100;i++){
if(i%2==0){
System.out.println("main+++++++++++++"+i);
}
}
}
}
认识多线程中常用方法
- (1)void start():启动线程,并执行对象的run方法
- (2)run():线程在被调度时执行的操作
- (3)String getName():返回线程名称
- (4)viod setName(String name):设置该线程名称
- (5)static Thread currentThread():返回当前线程
- (6)static viod yield():线程让步
- 暂停当前线程,把执行机会让给优先级相同或者更高的线程
- 若没有优先级更高或者相同的线程,则忽略该方法
- (7)join()方法调用的线程将被阻塞,直到join()方法加入的线程完成为止
- (8)static viod sleep(long millis)指定时间毫秒
- 令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
- (9)boolean isAlive(),返回boolean,判断线程是否还活着
- (10)setPriority()设置线程优先级
package com.com.sun.test;
/**
* @author sun
* @date 2021/6/22 - 9:00
*/
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
*
* 5.认识多线程中常用方法
* (1)void start():启动线程,并执行对象的run方法
* (2)run():线程在被调度时执行的操作
* (3)String getName():返回线程名称
* (4)viod setName(String name):设置该线程名称
* (5)static Thread currentThread():返回当前线程
* (6)static viod yield():线程让步
* 暂停当前线程,把执行机会让给优先级相同或者更高的线程
* 若没有优先级更高或者相同的线程,则忽略该方法
* (7)join()方法调用的线程将被阻塞,直到join()方法加入的线程完成为止
* (8)static viod sleep(long millis)指定时间毫秒
* 令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
* (9)boolean isAlive(),返回boolean,判断线程是否还活着
* (10)setPriority()设置线程优先级
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest2 extends Thread {
//2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
@Override
public void run() {
//遍历一百以内的所有偶数
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
try {
//static viod sleep(long millis)指定时间毫秒
//令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread().getName()获取当前线程的名称
System.out.println(Thread.currentThread().getName()+":"+i);
}
//static viod yield():线程让步
if(i%20==0){
yield();
}
}
}
}
public class MyThread2 {
public static void main(String[] args) {
// 3.创建Thread类的子类对象
MyThreadTest2 myThreadTest = new MyThreadTest2();
//设置
myThreadTest.setPriority(Thread.MAX_PRIORITY);
//4.通过此对象调用start()方法,启动子线程
myThreadTest.start();
for (int i=0;i<100;i++){
if(i%2==0){
//Thread.currentThread().getName()获取当前线程的名称
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
多线程卖片例子:
package com.com.sun.test;
/**
* @author sun
* 创建三个买票窗口,总票数为100张
* 存在线程安全问题
* @date 2021/6/26 - 9:06
*/
public class WindowsTest{
public static void main(String[] args) {
Window w1=new Window();
Window w2=new Window();
Window w3=new Window();
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();
}
}
class Window extends Thread{
//票数,设置为静态,让多个窗口共用,不然会出现三百张票
private static int ticket=100;
@Override
public void run() {
while(true){
if(ticket>0){
System.out.println(getName()+"卖票:票号为:"+ticket);
ticket--;
}else{
break;
}
}
}
}