A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区 黑马粉丝团   /  2019-9-3 20:53  /  884 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.什么是线程,什么是进程?
2.实现多线程有几种方式?哪种比较好,好在哪里?
3.为什么会出现线程安全问题,该如何解决线程安全问题?
4.解决线程安全问题的原理?
5.sleep和wait方法的区别?

3 个回复

倒序浏览
1.什么是线程,什么是进程?
    线程是进程中的执行单元,是cpu与代码片段的执行通道
    进程是内存中的一片空间,正在运行的程序

2.实现多线程有几种方式?哪种比较好,好在哪里?
    两种方式 继承Thread 实现Runnable 重写run方法
    实现接口的方式比较好 接口可以多实现,避免了类继承的局限性,继承Thread占了继承位置,无法继承别的类
            
   
3.为什么会出现线程安全问题,该如何解决线程安全问题?
     多个线程同时访问共享变量,且对共享变量做出了修改操作
     可以使用同步方法 锁是this
             同步块 锁是任意锁
             或者使用Lock接口的lock()获得锁,unLock()释放锁
4.解决线程安全问题的原理?
      多个线程共享同一个同步锁,只要有一个线程抢到执行权,就会带着同步锁直到遇到阻塞或者任务执行完毕才释放锁,
      这样其他线程即使抢到了执行权也无法进入同步代码中

5.sleep和wait方法的区别?
  sleep 释放执行权  不释放锁  只能指定睡眠时间
  wait 释放执行权 释放锁  可以指定时间也可以不指定,不指定需要对应的notify/notifyAll唤醒
回复 使用道具 举报
1.什么是线程,什么是进程?
1)  进程是系统正在运行的程序
2)线程是进程中的单个顺序控制流,是一条执行路径

2.实现多线程有几种方式?哪种比较好,好在哪里?
1)定义一个类继承类,在类中重写run()方法,创建类对象,启动线程;
2)定义一个类实现Runnable接品,在类中重写run()方法,创建类对象,把类对象作为构造方法的参数创建Thread类对象。
相比继承Thread类,实现Runnable接口比较好:①避免了Java单继承的局限性②适合多个相同程序的代码去处理同一个资源的情况,把线程 和程序的代码、数据有效分离,较好的体现了面向对象的设计思想

3.为什么会出现线程安全问题,该如何解决线程安全问题?
1)线程执行的随机性
2)让线程没有安全问题的条件

4.解决线程安全问题的原理?
把多条语句操作共享数据用代码锁起来,让任意时刻只能有一个线程执行。

5.sleep和wait方法的区别?
Sleep()方法是让线程释放CPU;wait()方法是释放CPU和锁对象。
回复 使用道具 举报
1、什么是进程?什么是线程?
进程是系统中正在运行的一个程序,程序一旦运行就是进程。

进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时,每个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。

线程是进程的一个实体,是进程的一条执行路径。

线程是进程的一个特定执行路径。当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化。
2、 一种是扩展java.lang.Thread类
另一种是实现java.lang.Runnable接口

好处就是:
在实际开发中通常以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类可以避免继承的局限,一个类可以继承多个接口,适合于资源的共享。
3、计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址。当多个线程并发访问同一个内存地址并且内存地址保存的值是可变的时候可能会发生线程安全问题,因此需要内存数据共享机制来保证线程安全问题。
4、只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。
5、两者的区别
这两个方法来自不同的类分别是Thread和Object  
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。  
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)  
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常  
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。  
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程  
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马