多线程(1)

来源:互联网 发布:数据库脚本怎么写 编辑:程序博客网 时间:2024/05/23 19:27


进程:就是应用程序在内存中分配的空间。(正在运行的程序)

线程:是进程中负责程序执行的执行单元,也称为执行路径。
    一个进程中至少有一个线程在负责该进程的运行。
  如果一个进程出现了多个线程,就称该程序为多线程程序。

多线程技术:解决多部分代码同时执行的需求,合理的使用cpu资源

多线程的运行根据cpu的切换完成的,怎么切换cpu说的算,
所以多线程运行有一个随机性(cpu的快速切换造成的)

jvm中的多线程。
至少有两个线程:一个是负责自定义代码运行的,这个从main方法开始执行的线程称之为主线程。
            一个是负责垃圾回收的。
通过实验,会发现每次结果不一定相同,因为随机性造成的。
而且每一个线程都有运行的代码内容,这个称之为线程的任务。
 之所以创建一个线程就是为了去运行制定的任务代码。

 而线程的任务都封装在特定的区域中,
 比如: 主线程运行的任务都定义在main方法中,垃圾回收线程在收垃圾都会运行finalize方法

** 如何建立一个执行路径呢?
 api文档,java.lang.Thread类
该类的描述中有创建线程的两种方式:
** 第一种方式:
 1,继承Thread类
 2,覆盖run方法
 3,创建子类对象就是创建线程对象
 4,调用Thread类中的start方法执行线程。并会调用run方法。

 start()开启线程后,都会执行run方法。说明run方法中存储的是线程要运行的代码
 所以,记住,自定义线程的任务代码都储存在run方法中。

 调用start和调用run方法的区别?

 调用start会开启线程,让开启的线程去执行run方法中的线程任务。
 直接调用run方法,线程并未开启,去执行run方法的只有主线程。

 Thread.current.Thread()//当前线程


 **创建线程的第二种方式,实现Runnable接口:
1,定义一个类实现Runnable。
2,覆盖Runnable接口中的run方法,将线程要运行的任务代码存储到该方法中。
3,通过Thread类创建线程对象,并将实现了Runnable接口的对象作为Thread类的构造函数的参数进行传递
4,调用Thread类的start方法,开启线程。

实现Runnable接口的好处:
1,避免了继承Thread类单继承的局限性。
2,Runnable接口出现更符合面向对象,将线程进行对象的封装。
3,Runnable接口出现,降低了线程对象和线程任务的耦合性。
所以,以后创建线程都使用第二种方式。
 

多线程的安全问题:

产生的原因:
1,线程任务中有处理到的共享的数据。
2,线程任务中有多条对共享数据的操作
 一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。

解决的思想:
 只要保证多条操作共享数据的代码在某一时间段,被一条线程所执行 ,
 在执行期间不允许其他线程参与运算。

怎么保证?
用到同步代码块。
synchronized(对象(obj))
{
   需要被同步的代码
}

同步在目前情况下保证了一次只能有一个线程在执行,其他线程进不来
这就是同步的锁机制

好处:解决了多线程的安全问题
弊端:减低效率。

有可能出现一种情况:
    多线程安全问题出现后;加入了同步机制,没有想到,安全问题依旧! 咋办,
这时肯定是同步出了问题
只要遵守了同步的前提,就可以解决。
同步的前提:
     多个线程在同步中必须使用同一个锁,这才是对多个线程同步。

0 0