进程与线程
一、线程的执行过程
线程的执行过程.png
二、实现线程的两种方法
1、定义一个线程类,需继承Thread类
class FirstThread extends Thread {
//必须重写run方法,该方法称为线程体
public void run () {
for (int i=0;i<100;i++){
System.out.println("FirstThread-->"+i);
}
}
}
class Test {
public static void main(String args[]) {
//生成一个线程类的对象
FirstThread ft = new FirstThread();
//使用start方法启动线程
ft.start();//ft线程处于就绪状态
//ft.run();不能这样运行
for (int i=0;i<100;i++){
System.out.println("mainThread-->"+i);
}
}
}
2、实现Runnable接口
class RunnableImpl implements Runnable {
public void run(){
for (int i=0;i<100;i++){
System.out.println("Runnable-->"+i);
}
}
}
class Test {
public static void main(String args[]) {
//生成一个Runnable接口实现类的对象
RunnableImpl ri= new RunnableImpl();
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数,传递给Thread对象
Thread t = new Thread(ri);
//使用start方法启动线程
t.start();//ft线程处于就绪状态
for (int i=0;i<100;i++){
System.out.println("mainThread-->"+i);
}
}
}
三、线程的控制方法
中断线程
Thread.sleep(); //线程休眠,参数为毫秒,需要捕获异常,结束后线程进入就绪状态
Thread.yield(); //自动让出CPU,然后和其他线程一起再次抢占CPU
设置线程的优先级,最大是10,最小是1
getPriority();
setPriority();
Thread t = new Thread(ri);
t.setPriority(Thread.MAX_PRIORITY); //设置最大优先级 10
t.setPriority(Thread.MIN_PRIORITY); //设置最小优先级 1
五、多线程数据安全
class MyThread implements Runnable {
int i = 100;
public void run(){
while(true){
synchronized(this){ //同步锁,this为锁住的对象,this可以是其他对象
//获取当前代码运行的线程
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
class Test {
public static void main(String args[]) {
MyThread ri= new MyThread();
//生成两个Thread对象,这两个Thread公用同一个线程体
Thread t1 = new Thread(ri);
Thread t2 = new Thread(ri);
t1.setName("线程a");
t2.setName("线程b");
t1.start();
t2.start();
}
}
注:如果一个线程获得了一个对象的同步锁,那么这个对象上所有其他同步的代码都是不能被其他线程执行,都需要等待同步锁释放后才能被执行。
同步方法
public synchronized void fun1(){
//同步方法锁住的对象是this
}
网友评论