知识点总结
java中的线程模型:一个虚拟cpu,多个线程
static start方法:启动线程而非运行线程(仅仅告诉虚拟机,该线程已经准备完毕,cup决定线程运行的时刻)
static sleep方法:在制定的毫秒数内让当前正在执行的线程休眠
static yield方法:主动让出cpu,重新排队,正在执行的线程将cpu让给其他具有相同优先级的线程,自己进入就绪状态重新排队
finnal join方法:等待该线程结束
继承一个Thread类
private class MyThread extends Thread{
/**
* <p>覆盖的run函数</p>
* @see java.lang.Thread#run()
* 实现run方法,安放代码逻辑
*/
@Override
public void run() {
while(true){
lt=LocalTime.now();
lab_time.setText(lt.format(formatter));
try {
// milli second 毫秒 1000 milli=1s
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
缺点:无法再继承其他的类,逻辑上既有cpu,又有线程,比较混乱
实现runnable接口
private class MyThread2 implements Runnable{
/**
* <p>覆盖的run函数</p>
* @see java.lang.Thread#run()
* 实现run方法,安放代码逻辑
*/
@Override
public void run() {
while(true){
lt=LocalTime.now();
lab_time.setText(lt.format(formatter));
try {
// 静态方法,在某些地方可能受限
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
调用方法
自定义线程的调用,start():启动线程而非运行线程(仅仅告诉虚拟机,该线程已经准备完毕,cup决定线程运行的时刻)
new MyThread().start();
交替调用两个线程
自定义线程如下:
private class MyThread_run implements Runnable{
String str;
public MyThread_run(String str) {
this.str=str;
}
/**
* <p>覆盖的run函数</p>
* @see java.lang.Thread#run()
* 实现run方法,安放代码逻辑
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread()+":"+str+" 数字:"+i);
try {
// 静态方法,在某些地方可能受限
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
调用线程,线程交替运行,sleep时间越长越容易看出效果
Thread t1=new Thread(new MyThread_run("t1"));
Thread t2=new Thread(new MyThread_run("t2"));
t1.start();
try {
t1.sleep(1000);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
轮流调用两个线程
class TwoThread3 extends Thread {
static StringBuffer obj=new StringBuffer();
boolean f=true;
int mark=0;
String num;
public TwoThread3(String num) {
this.num=num;
}
/**
* <p>
* 覆盖的run函数
* </p>
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
synchronized (obj) {
if (num.equals("2")&&mark==0) {
mark=1;
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
obj.append(num);
System.out.print(num);
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
save_as_file();
}
// 将运行结果写入文件
public void save_as_file() {
File file = new File("Result.txt");
try {
FileWriter fr = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fr);
bw.write(obj.toString());
bw.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TwoThread {
public static void main(String[] args) {
// 如果线程的对象不一致,则释放出来的锁不是另一个线程希望的锁,为死锁状态
String s = "";
new TwoThread3("2").start();
new TwoThread3("1").start();
}
}
运行效果:
12121212121212121212
写入文件的内容: