一.创建多线程的第一种方式,创建Thread类的子类
实例1
1.在子类中重写Thread中的run方法
2.创建子类的对象
3.调用start()方法开启线程,java虚拟机调用run方法
4.run方法和main方法并发执行
5.java属于抢占调度
class MyThread extends Thread{
public void run() {
for(int i = 0;i<5;i++) {
System.out.println("run"+i);
}
}
}
public class Demo01Thraed {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
//主线程会继续执行主方法中的代码
for(int i = 0;i<5;i++) {
System.out.println("main"+i);
}
}
}
运行结果
实例二
通过调用Thread类中的两个方法获取线程的对象和名字(currentThread()和getName()方法)
class MMyThread extends Thread{
public void run() {
System.out.println(Thread.currentThread().getName());//获取线程的对象和名字
} //currentThread()返回当前正在执行的线程的对象的引用
//getName()获取线程的名称,默认情况下从0开始
}
public class Demo02Thraed {
public static void main(String[] args) {
MMyThread mt =new MMyThread();
mt.start();
MMyThread mt1 =new MMyThread();
mt1.start();
new MMyThread().start();//三个线程
}
}
运行结果
实例三
通过构造方法自己设置名字
class Tgg extends Thread{
public Tgg(){
}
public Tgg(String name) {
super(name);
}
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了");
}
}
public class Demo03Thread {
public static void main(String[] args) {
new Tgg("小刘").start();
new Tgg("小卫").start();
new Tgg("小刚").start();
}
}
运行结果
实例四
main()方法和自己的线程争cpu
/*1.主线程main
*2.新建的线程
*3.抢占cpu
*/
class ee extends Thread{
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了");
}
}
public class Examople04 {
public static void main(String[] args) {
new ee().start();
new ee().start();
System.out.println(Thread.currentThread().getName()+"执行了");
}
}
运行结果
实例五
1.Thread类中sleep方法的使用
2.这个方法有异常,要处理
3.这个方法的主要作用就是让程序休眠一定的时间在继续下面的过程
/*
*1.此程序仅仅关于Thread类中的sleep()方法
* public static void sleep(long mills)使当前在运行的程序暂停多少毫秒 */
public class Example05 {
public static void main(String[] args) {
System.out.println("每两秒打印一个数");
for(int i=0;i<5;i++) {
System.out.println(i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("结束");
}
}
运行结果
二.创建线程的第二种方式,创建一个Runnable接口的实现类
实例1
- 1.创建一个Runnable接口的实现类
- 2.在实现类中重写Run,设置线程任务
- 3.创建一个Runnable接口的实现类对象
- 4.创建==Thread类对象,构造方法传递Runnable接口的实现类对象
- 5.调用Thread类中的Start方法,开启新的线程执行Run方法
class yy implements Runnable{
public void run() {//自己建的
for(int i =0;i<5;i++)
System.out.println(Thread.currentThread().getName()+"执行了");
}
}
public class Example06 {
public static void main(String[] args) {
yy y = new yy();
Thread wu = new Thread(y);
Thread er = new Thread(y);
wu.start();
er.start();//创建了两个
//主线程的
for(int i = 0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+"执行了");
}
}
}
运行结果
多运行几次,结果都是不一样的
结果1
结果2
实例二
买票问题
/*
* 线程的应用
* 设置线程任务:卖票
*
* */
class uio implements Runnable{
//定义多个线程共享的票源
private int ticket = 50;
//设置线程任务:卖票
public void run() {
//让其
while(true) {
//先判断票是否存在
if(ticket>0) {
//提高安全问题出现的概率
try {
//票存在就卖票
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().
getName()+"卖出了第"+ticket+"票");
ticket--;
}
}
}
}
public class Example07 {
public static void main(String[] args) {
uio pp = new uio();
//创建Thread类对象,构造方法中传递Runnable接口中的实现类对象
Thread t1 = new Thread(pp);
Thread t2 = new Thread(pp);
Thread t3 = new Thread(pp);
//调用start方法开启三个线程
t1.start();
t2.start();
t3.start();
}
}