多线程:
进程:正在执行中的程序。其实是应用程序在内存中运行的那片空间。
线程:进程中的一个执行单元,负责进程中的程序的运行,一个进程中至少要有一个线程,一个进程是可以有多个线程的,这个应用程序也可以称之为多线程程序。
程序启动了多线程,有什么应用呢?可以实现多部分程序同时执行:称之为并发。
windows多任务多线程,cpu处理的一直是线程。
多线程的使用可以合理使用cpu的资源,如果线程过多会导致降低性能。
cpu在处理程序时是通过快速切换完成的,在我们看来好像同时一样。
创建线程有两种方式:
1,继承thread类。
1.1定义一个类继承thread。
1.2重写run方法。
1.3创建子类对象,就是创建线程对象。
1.4调用start方法,开启线程并让线程执行,同时还会告诉jvm去掉用run方法。
获取线程名称:
thread:currentThread()获取当前线程对象,获取名称通过getName();方法。
主线程名称:main,自定义线程:thread-1,线程为多个时后面数字顺延。
创建线程的另一种方法,是声明实现Runnable接口的类,该类然后实现run方法,然后可以分配该类的实例,在创建thread时作为一个参数来传递并启动。
2,实现runnable接口。
2.1定义类实现Runnable接口:避免了继承Thread类的单继承局限性,
2.2覆盖接口中的run方法。将线程任务代码定义到run方法中。
2.3创建thread类的对象:只有创建Thread类的对象才可以创建线程。
2.4将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
因为线程已经被封装到Runnable接口的run方法中。而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。
2.5调用Thread类的start方法开启线程。
第二种方式实现Runnable接口避免了单继承的局限性。所以较常用。实现Runnable接口的方式,更加符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。
第一种继承Thread类,线程对象和线程任务耦合在一起,一旦创建Thread类的子类对象,即是线程对象,又有线程任务。实现Runnable接口是将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。
Runnable接口对线程对象和线程任务进行解耦。
让线程在程序中稍停 ,使用thread。sleep();
发生了线程安全问题,出现了错误的数据:
问题产生的原因:
1,多个线程在操作共享的数据。
2,线程任务操作共享数据的代码有多条(运算有多个)。
解决思路:
只要让一个线程在执行线程任务时将多条操作共享的数据的代码执行完,在执行的过程中,不要让其他线程参与运算。就哦了。
java中解决此问题时,是通过代码块来完成的。
同步代码块:synchronized(对象){需要被同步的代码}
同步代码块解决了多线程安全问题。
同步好处:
解决线程的安全问题。
同步弊端:
降低了程序的性能。
同步前提:必须保证多个线程在同步中使用同一个锁。
解决了什么问题?当多线程安全问题发生时,加入了同步后,问题依旧,就要通过这个同步的前提来判断同步是否写正确。
|
|