多线程

1、线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行。

   一个进程中至少有一个线程,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序

时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了

   一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出 。

2、创建线程的方式
(1)第一种方式:继承Thread类。
步骤:
A.定义类继承Thread。
B.复写Thread类中的run方法。目的:将自定义代码存储在run方法。让线程运行。
C.调用线程的start方法,该方法两个作用:启动线程,调用run方法
(2)创建线程的第二种方式:实现Runable接口
步骤:
A.定义类实现Runnable接口
B.覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中。
C.通过Thread类建立线程对象。
D.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
E.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
两种方法创建线程及线程的状态
//自定义类继承Thread类
class MyThreadEx extends Thread{
String name;
//定义构造函数,给线程初始化名称
public MyThreadEx(String name) {
super(name);
}
@Override//重写run方法,存线程代码
public void run(){
for (int i = 0; i < 100; i++) {
//线程执行中
System.out.println(Thread.currentThread().getName()+"......"+i);
}
}//方法结束,线程消亡
}
//自定义类实现接口
class MyThreadImpl implements Runnable{

@Override//重写run方法,存线程代码
public void run() {
for (int i = 0; i < 100; i++) {
//线程执行中
System.out.println(Thread.currentThread().getName()+"******"+i);
}
}
} //方法结束,线程消亡
public class MyThreadImplTest {

public static void main(String[] args) {
//创建子类对象,线程创建
MyThreadEx mte = new MyThreadEx("继承方式线程");
//调用start()方法,又jvm调用run方法,线程就绪中,争抢cup执行权
mte.start();
//创建接口子类对象,线程创建
MyThreadImpl mti = new MyThreadImpl();
//创建Thread 类对象,并传入接口子类对象
Thread t = new Thread(mti,"接口方式线程");
//调用start()方法,又jvm调用run方法,线程就绪中,争抢cup执行权
t.start();
}

}

3、线程的同步
1:产生线程安全的原因
A:多个线程访问出现延迟。
B:线程访问的随机性

注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。
2:如果判断一个线程程序有没有安全问题呢?
A:多个线程操作共享数据
B:这个操作是分多条语句执行的。
3:解决线程安全问题的方式
A:同步代码块
格式:
synchronized(对象)
{
//需要被同步的代码
}
B:同步方法
当一个方法的方法体都被同步代码块给包围起来了,我们就可以使用另外一种方式来表示。就是同步方法。
格式在方法声明上加同步关键字synchronized

4、线程调度的模式有两种:

分别是分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;

抢占式调度是根据线程的优先级别来获取CPU的使用权。而JVM的线程调度模式采用了抢占式模式。

多线程还有一种“并发执行机制”

所谓的“并发执行”并不是真正意义上的同时执行

例如:

public static void main(String[] args)
{
Runnable mt1=new MyThread();
Runnable mt2=new MyThread();
new Thread(mt1).start();
new Thread(mt2).start();
}

class MyThread implements Runnable
{
public void run()
{for(int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+":"+"i");
}
}

这里并行是指线程轮流获取CPU的使用权,并平均分配每个线程占用CPU的时间。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章