在操作系统中,同时有许多个进程在运行,他们依照优先级排列,依次占用资源来运行。一个进程由多个线程组成。
Java在运行的时启动JVM,每个JVM相当于是一个进程,而其中至少会有两个线程启动,分别是GC(垃圾回收机制),主线程(main)
一.多线程的两种实现方法
1.继承Thread类,重写run()方法,利用该类中的start()方法来启动线程
class MyThread extends Thread{ //本质上Thread类是Runnable的实现类 但是单继承扩展性不好
String name;
int tacket = 5;
public MyThread(String name) {
this.name = name;
}
public void run() { //创建线程需要对run方法进行重写
while(tacket!=0){
System.out.println(name+tacket–);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt = new MyThread(“线程A”); //参数为线程名
MyThread mt1 = new MyThread(“线程B”);
mt.start(); //调用start方法自动调用run方法
mt1.start();
}
}
2.实现Runnable接口,必须重写run()方法,在利用Thread类的构造函数传入实现接口的引用,最后调用属于Thread类的start()方法启动
class Mythread1 implements Runnable{
int tacket = 5;
static String str =””;
public void run() {
// TODO Auto-generated method stub
while(tacket!=0){
str += Thread.currentThread().getName()+tacket–+”/n”;
}
}
}
public class RunnableDemo {
public static void main(String[] args) {
Mythread1 mt = new Mythread1();
Thread t = new Thread(mt,”线程A”);
Thread t1 = new Thread(mt,”线程B”);
Thread t3 = new Thread(mt);
t.start(); //调用start方法 CPU对线程进行调度 然后执run方法运行
t1.start();
}
}
二.这两种种方法的比较
目前开发一般会使用第二种,也就是实现Runnable接口主要是有两个原因
1.继承Thread是单继承,而实现Runnable接口提高了程序的可扩展性
2.实现Runnable接口可以资源实现共享
线程的状态:创建,就绪,运行,阻塞,终止
介绍一些线程的常用操作
static Thread currentThread()返回对当前正在执行的线程对象的引用。
String getName() 返回该线程的名称。
int getPriority()
返回线程的优先级。
主线程的优先级为5,最高优先级为10,最低优先级为1。
boolean isAlive()
测试线程是否处于活动状态。
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static void yield()
暂停当前正在执行的线程对象,并执行其他线程。
同步和死锁
三.资源共享时候使用同步(Synchronization),有两种同步方法:
1.同步代码块
2.同步方法
同步代码块的效率要高于同步方法
同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁。
很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。
在程序中过多的同步会发生死锁现象,及两个线程一直处于相互等待状态,如果没有外力干扰会一直等待下去
转载请注明来源网站:blog.ytso.com谢谢!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14664.html