在Java中,线程对象的创建是用Threa类或者它的子类创建。
在编写Thread类的子类时,需要重写父类的run()方法,其目的是规定线程的具体操作,否则线程就没有开始的地方
在这里,做一个小小总结:
··在线程的编写的时候,要重写父类的run()方法,在run()里写线程相关功能;
··在线程的调用的时候,线程必须要调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了
在这里,我们为了体现多线程交替使用CPU资源的,举蚂蚁吃蛋糕的例子,即每个小蚂蚁是一个线程,蛋糕是资源(即CPU),好了,
我们开始吧!
第一步:创建一个主类,一开始只有
public static void main(String[] args){
}
最后在添加方法和调用,最后运行前是这样的
package com.suzhou.dajiang;
public class main {
public static void main(String[] args) {
Cake cake = new Cake();
int size = 10;
cake.setSize(size);
System.out.println("蛋糕一个有"+size+"份");
Ant antRed = new Ant("红蚂蚁",cake);
Ant antblack = new Ant("黑蚂蚁",cake);
antRed.start();
antblack.start();
}
}
第二步:做一个蛋糕
package com.suzhou.dajiang;
public class Cake {
int size;
public void setSize(int n){
size = n;
}
public int getSize(){
return size;
}
public void lost(int m){//蛋糕剩余
if(size-m > 0){
size = size -m;
}
}
}
第三步:请最少两个蚂蚁过来(及最少两个线程,能体现线程轮流使用的效果)
package com.suzhou.dajiang;
public class Ant extends Thread{
Cake cake;
public Ant(String name, Cake cake){
this.cake = cake;
setName(name);
}
@Override
public void run() {//run方法,让线程跑起来
while (true){//死循环,让线程不停跑
int n=2;//每次蚂蚁吃的蛋糕数量
System.out.println(getName()+"吃"+n+"份蛋糕");//打印谁吃了蛋糕
cake.lost(n);//开始吃
System.out.println(getName()+"发现蛋糕还剩"+cake.getSize()+"份蛋糕");//剩余蛋糕数
cake.getSize();
try {//sleep()方法,让线程每循环一次休息一秒;然而错误提示,直接alt+ctrl+t抛出异常,就好喽
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (cake.getSize()<=2){
System.out.println("结束了");
return;//结束,跳出循环
}
}
}
}
编写线程子对象的第一步哈,就是重写run()方法,记住呀!