一:多线程 Thread
1.线程的概念,程序中的执行路径,控制进程的执行。
2.线程有五中状态分别是:创建,运行,消亡,冻结,阻塞
3.Thread里面的重要方法有sleep();start();run(); interrupt(),
yield();toString()
(1)sleep(),在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
(2)start();开启一个线程
(3)run(),内容为需要执行的代码块;
(4)interrupt(),中断线程。
(5)yield(),暂停当前正在执行的线程对象,并执行其他线程。
(6)toString(),回该线程的字符串表示形式,包括线程名称、优先级和线程组。
以上方法中:sleep()和yield(),方法都是暂停执行线程;
区别:
(一)sleep执行后线程进入阻塞状态,sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。
(二)yield执行后线程进入就绪状态,yield()只能使同优先级的线程有执行的机会。
4.创建线程有两种方法,继承 Thread类,实现Runnable接口
两种创建线程的方法实例体现:
class ThreadDemo extends Thread{
run(){
//定义要实现的操作
}}
class Demo{
main(){
ThreadDemo th1=new ThreadDemo ();
ThreadDemo th2=new ThreadDemo ();
}
}
实现Runnable接口的方法:
具体步骤:
1。定义类实现Runnable接口
2。覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中;
3.通过Thread类创建起线程对象
4.将Runnable接口的子类对象作为实际参数传给Thread类的构造函数(为了明确run()的所属对象);
5,调用Thread类的start启动线程并调用Runnable接口子类的run方法;
二者的区别与优点:
1,继承Thread类具有局限性,一个类只能继承一个父类,开发中一般不用。
2,定义类实现Runnable接口,Runnable定义的子类中没有start()方法,需要hread类的start().优点:可以避免Thread类的继承的局限,类可以继承多个接口,有利于资源的共享。
同步代码块:
此处知识点最重要的一部分为synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程,运行到这个方法时,都要检查有没有其它线程正在用这个方法,有的话要等正在使用synchronized方法的线程运行完这个方法后再运行此线程A;没有的话,直接运行。
代码实例:
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized : " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread tt1= new Thread(t1, "A");
Thread tt2= new Thread(t1, "B");
tt2.start();
tt1.start();
}
}
分析:在该代码段中通过实现Runnable接口来创建线程,在main()函数内创建两个线程分别为tt1,tt2线程,创建的线程要执run里面的循环打印,因为主函数里面最先启动的是tt2线程,所以在启动的时候synchronized 关键字开始检查有没有其他线程在运行,没有,则开始运行tt2线程,直到循环完成才开始启动tt1,也就保证了两个线程的安全运行而不会出现死锁的状态,加synchronized 大大的提高了安全性。
个人总结:在线程的创建中,有两种方式,但是一般开发都采取的是实现Runnable接口方式,具体原因上面有。在线程中更重要的是处理同步问题,异步问题,为了提高安全性,必须需要同步的执行代码块加锁才能有效的解决死锁或者其他问题。