多线程概念:
java语言提供并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制被称为多线程。
如果需要一个进程同时完成多段代码的操作,就需要产生多进程。
多线程利弊:
好处:解决了多部分同时运行的问题。
弊端:线程太多会导致效率的降低。
如何创建一个线程:
方式一:继承Thread类。
步骤:1.定义一个类继承Thread类。2.覆盖Thread类中的run方法。3.调用start()方法,启动线程。
public class ThreadTest extends Thread
{
public void run()
{
//将实现新建线程的功能的代码写入run()方法中。
}
public static void main(String[] args)
{
new ThreadTest().start();//需要调用start()方法来启动线程。
}
}
方式二:实现Runnable接口
线程一般都是通过Thread类来创建,如果程序员需要继承其他类(非Thread类),并使该程序可以使用到线程,就需要使用Runnable接口。(因为java不支持多继承)
步骤:1.定义类实现Runnable接口。2.覆盖接口中的run方法,将线程的任务代码封装到run方法中 3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。4.调用线程对象的start方法开启线程。
public class ThreadTest extends object implements Runnable
{
public void run()
{ //线程的任务代码 }
public static void main(String[] args)
{
ThreadTest Demo = new ThreadTest();
Thread Demo2 = new Thread(Demo);
Demo2.start();//启动线程
}
}
继承Thread和实现Runnable接口的区别:
1.Runnable接口将线程的任务从线程的子类中分离出来,进行了单独的封装。
2.避免java单继承的局限性。
创建线程的方法,实现Runnable接口的方法较为常用。
线程安全问题产生的原因:
1.多个线程在操作共享的数据。2.操作共享数据的线程代码有多条。
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程安全问题的产生。
在java中使用同步代码块就可以解决:
格式:synchronized(对象){同步代码块}
弊端:相对降低了效率
同步的前提:必须有多个线程并且使用同一个锁。
同步函数:将synchronized作为修饰词加在函数前:public synchronized void add(){}
同步函数使用的锁是:this;,同步代码块的锁是任意的对象。建议使用同步代码块。
静态同步函数使用的锁是:该函数所属字节码文件对象,可以用getClass方法获取,也可以用:当前类名.class表示。