一般一个软件运行会产生一个进程,一个进程会产生很多线程
生成线程的方法
方式1:
定义一个线程类,它继承类Thread并重写其中的方法run(),方法run()称为线程体
由于Java只支持单继承,用这种方法定义的类不能再继承其他类
public class FirstThread extends Thread{
public void run(){
for(int i=1;i<=20;i++){
System.out.println("FirstThread-->"+i);
}
}
public class Test {
public static void main(String args[]){
FirstThread ft=new FirstThread();//生成线程类对象
ft.start();//启动线程,进入就绪状态
for(int i=1;i<=20;i++){
System.out.println("main-->"+i);
}
}
上述代码主函数中存在2个线程,一个主函数main线程,一个ft线程,2个线程交替运行
方式2:(Java中倾向于使用接口,因为继承只能是单继承)
提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体。
线程的简单控制方法
try{
Thread.sleep(2000);
}
catch(Exception e){
System.out.println(e);
}
线程休眠2000ms,醒后进入就绪状态
Thread.yield()
线程释放运行的CPU,之后重新与其他线程竞争CPU
t为一个线程
t.getPriority()返回t的优先级(一个整数)
t.setPriority(Thread.MAX_PRIORITY);将t设为最高优先级(10)/MIN(1)
优先级越高,执行的概率越大。
线程同步
1.多线程数据安全
2.同步线程的方法
this是一个同步锁,一个线程必须运行完synchronized里面的内容才能释放同步锁,让其它线程运行这部分。
一个线程获得了一个对象的同步锁,这个对象上的所有同步代码都不能被其他线程执行
public class MyThread1 extends service{
private service s;
public MyThread1(service s){
this.s=s;
}
public void run(){
s.fun1();
}
}
public class MyThread2 {
private service s;
public MyThread2(service s){
this.s=s;
}
public void run(){
s.fun2();
}
}
输出:
fun1
//3s
fun2
如果public void fun2()同步标记去掉,那么先输出fun2,再fun1
同步方法函数:锁住this
和刚刚法一的效果一样