一、程序、进程、线程的区别是什么?
答:
程序:
1)、是一个指令的集合。程序不能独立执行,只有被加载到内存
中,系统为它分配资源后才能执行
进程:
1)、一个执行中的程序称为进程,进程是系统分配资源的独立单位,每个进程占有特定的地址空间;程序是进程的静态文本描述,进程是程序在系统内顺序执行的动态活动.
线程:
1)、是进程的"单一的连续控制流程"线程是CPU调度和分配的基本单位,是比进程更小的能独立运行的基本单位,也被称为轻量级的进程。
2)、线程不能独立存在,必须依附于某个进程。一个进程可以包括多个并行的线程,一个线程肯定属于一个进程.
3)、Java 虚拟机允许应用程序并发地执行多个线程。

二、【编程题】请写下创建多线程的方式?
答:

/**
一种:Thread的继承
/
public class Test extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
public static void main(String[] args) {
Test test = new Test();
test.start();//启动线程
}
}
/
*

  • 二种:Runnable的实现
  • */
    public class Test implements Runnable{
    @Override
    public void run() {
    }
    public static void main(String[] args) {
    Test test = new Test();
    Thread thread = new Thread(test);
    thread.start();//启动线程
    }
    }
    三、Thread 类有没有实现 Runnable 接口?
    答:
    有实现Runnable 接口

四、当调用一个线程对象的 start 方法后,线程马上进入运行状态吗?
答:
不是,只是进入就绪(可运行)状态,等待分配 CPU 时间片。一旦得到 CPU 时间片,即进入运行状态。

五、sleep、yield、join 方法的区别?
sleep():
1)、在指定时间内让线程暂停执行,进入阻塞状态,让其他线程有机会继续执行,但它并不释放对象锁。
2)、如果有Synchronized同步块,其他线程仍然不同访问共享数据;
join():
1)、等待调用该方法的线程执行完毕后再往下继续执行。如:在 main 方法中调用 j.join(),那 main 方法在此时进入阻塞状态,一直等 j 线程执行完,main 方法再恢复到就绪状态,准备继续执行。
yield():
1)、调用该方法的线程暂停一下,回到就绪状态。所以调用该方法的线程很
可能进入就绪状态后马上又被执行。

public class StringAdmin {
public static void main(String[] args) {
Thread t1 = new MyThread();
t1.start();
for (int i = 0; i < 20; i++) {
System.out.println(“主线程第” + i + “次执行!”);
try {
t1.join(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(“线程1第” + i + “次执行!”);
}
}
}
六、为什么不推荐使用 stop 和 destroy 方法来结束线程的运行?
答:
stop()
1、可以强行中止一个正在运行或挂起的线程。
2、stop 方法不安全。
destroy()
1、该方法最初用于破坏该线程,但不作任何资源释放。
2、它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,如果想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁

七、synchronize 修饰在方法是什么意思?
答:
一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是
在 synchronized 方法内部的线程)执行完该方法后,别的线程才能进入.

八、synchronize修饰的语句块,是表示该代码块运行时必须获得对象的锁。如果没有获得,会有什么情况发生?
答:
如果没有获得对象的锁,就不能执行 synchronize 修饰的语句块,包括此语
句块,还有其他需要获得此对象锁才能执行的同步代码块和同步方法。

public class Piao implements Runnable{
private int age;
private int a;
int ages;
int agess=0;
@Override
public void run() {
int i = getAge();
for(int j=1;j<=i;j++){
synchronized(this){
if(ages>0){
System.out.println(“购票:第”+(agess+1)+“张,”+“目前余票:”+(ages-1)+“张”);
ages–;
agess++;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ages==0){
System.out.println(“票已售完.还请明天购票.谢谢”);
break;
}
}
}
public Piao(int age, int a) {
super();
this.age = age;
this.ages = a;
}
}
//getter setter 方法
九、死锁是怎么造成的?
答:
如两个或多个线程都在等待对方释放锁才能继续执行,有
时会出现僵持局面:两个或多个线程都持有对方需要的锁,而两个或多个线程都需要对方释放锁了才能继续运行。这样就会出现死锁的现象;

package com.str.strs;
public class Locks{
public static String LockA = “LockA”;
public static String LockB = “LockB”;
public static void main(String[] args){
Thread a = new Thread(new LockA());
Thread b = new Thread(new LockB());
a.start();
b.start();
}
}
class LockA implements Runnable{
@Override
public void run(){
try{
System.out.println(“LockA开始执行了”);
while(true){
synchronized(Locks.LockB){
System.out.println(“LockA 得到LockB的锁”);
Thread.sleep(3000);
synchronized(Locks.LockA){
System.out.println(“LockA 得到LockA的锁”);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
class LockB implements Runnable{
@Override
public void run(){
try{
System.out.println(“LockB开始执行了”);
while(true){
synchronized(Locks.LockA){
System.out.println(“LockB 的到了LockA的锁”);
Thread.sleep(3000);
synchronized(Locks.LockB){
System.out.println(“LockB 的到了LockB的锁”);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
十、【编程题】使用 Timer 和 TimerTask 实现定时器?
答:

public class Locks {
public static void main(String[] args) {
Timer timer = new Timer();
DateFormat df = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss SS”);
Date firstDate = null;
try {
firstDate = df.parse(“2018/3/29 13:40:00 00”);
System.out.println(new Date());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.schedule(new LockA(), firstDate, 2000);
}
}
class LockA extends TimerTask {
int i = 0;
@Override
public void run() {
System.out.println(new Date());
System.out.println(“执行了” + i + “次”);
i += 1;
}
}
十一、wait 方法被调用时,所在线程是否会释放所持有的锁资源? sleep 方法呢?
答:
wait:释放 CPU,释放锁;
sleep:释放 CPU,不释放锁。

十二、wait、notify、notifyAll是在Object类中定义的方法吗?作用分别是什么?
答:
1)、wait(),notify(),notifyAll()不属于Thread类 ,而是属于 Object类,每个对象都有wait(),notify(),notifyAll()的功能。因为每个对像都有锁;
方法作用分别是:
wait 方法与 notify 方法必须在同步块内执行,synchronized(obj)之内
wait:
导致当前线程等待,进入阻塞状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
notify:
1)、唤醒在此对象监视器(对象锁)上等待的单个线程。
2)、如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。
3)、直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程
4)、只是对象监视器的所有者的线程来调用.
notifyAll:
1)、唤醒在此对象监视器(对象锁)上所有等待的线程

public class qwe {
public static void main(String[] args) {
Printer p = new Printer();
new Thread() {
public void run() {
while (true) {
try {
p.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
while (true) {
try {
p.print2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
//等待唤醒机制
class Printer {
private int flag = 1;
public void print1() throws InterruptedException {
synchronized (this) {
if(flag!=1){
this.wait(); //当前线程等待
}
System.out.print(“print1”);
flag = 2;
this.notify();//随机唤醒单个等待的线程
}
}
public void print2() throws InterruptedException {
synchronized (this) {
if(flag!=2){
this.wait();
}
System.out.print(“print2”);
System.out.println();
flag = 1;
this.notify();
}
}
}
十三、notify 是唤醒所在对象 wait 中的第一个线程吗?
答:
不是。调用 notify() 方法导致解除阻塞的线程中随机选取的一个线程

十四、如何确保N个线程可以访问N个资源同时又不导致死锁?
答:
使用指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

十五、【编程题】请写出单例模式之饿汉式与描述特点
答:
1、饿汉式,线程安全
2、保证类在内存中只有一个对象.

class Singleton{
//1.私有构造方法,其他类不能访问该构造方法了
private Singleton(){
}
//2. 创建本类对象
private static Singleton s = new Singleton();
//3.对外提供公共的访问方法 获取实例
public static Singleton getInstance(){
return s;
}
}
十六、【编程题】请写出单例模式之懒汉式与描述特点
答:
1、非线程安全
2、单例模式延迟加载

class Singleton{
//1.私有的构造方法
private Singleton(){
}
//2.声明一个本来的引用
private static Singleton s = null ;
//3.对外提供公共访问方法
public synchronized static Singleton getInstance(){
if(s == null){
s = new Singleton02();
}
return s;
}
}
十七、【编程题】请写出单例模式第三种格式
答:

class Singleton {
private Singleton() {}
public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
}
十八、多线程(线程的五种状态)
答:
新建,就绪,运行,阻塞,死亡

十九、【编程题】使用二种匿名内部类方法来完成线程
答:

          一种
public static void main(String[] args) {new Thread(){          // 1. 继承Thread类@Override              public void run() {  //2. 重写run方法for(int i =0;i<1000;i++){ //3. 将要执行的代码写在run方法中System.out.println("线程1"+i);}}}.start(); //4. 启动线程/**二种*/new Thread(new Runnable() {//1. 将Runnable的实现类传递给Thread类的构造方法@Overridepublic void run() {    //2. 重写run方法for(int i =0;i<1000;i++){ //3. 将要执行的代码写在run方法中System.out.println("线程2"+i);}}}).start(); //4. 启动线程
}

09 Java程序员面试宝典视频课程之多线程相关推荐

  1. 12 Java程序员面试宝典视频课程之面向对象

    一.简述面向对象和面向过程的区别和联系? 答: 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想 区别 编程思路不同: 面向过程以实现功能的函数 ...

  2. 02 Java程序员面试宝典视频课程之异常

    一.Java 中,处理异常的两大步是? 答 捕获异常 声明异常 二.如果 catch 两个异常,一个是父类,一个是子类.这两个异常的 catch 顺序如何确定? 答 子类异常在前父类异常在后 三.fi ...

  3. 13 Java程序员面试宝典视频课程之容器

    一.容器指的是"可以容纳其他对象的对象",这种说法对吗? 答: 对.容器自己也是对象,同时可以装其他对象的引用. 二.Collection/Set/List 的联系跟区别? 答: ...

  4. 19 java程序员面试宝典视频课程之正则表达式

    一.正则表达式是用来做什么的? 答: 正则表达式是用来处理字符串的,可以用一些特定字符来描述字符串里字符出现的规则,从而匹配,提取或者替换符合某一个规则的字符串 二.说出\d,\w,\s,.,[123 ...

  5. 11 Java程序员面试宝典视频课程之网络编程

    一.什么是计算机网络?网络的主要类型有哪些: 答: 计算机网络是将不同地理位置的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实 ...

  6. 03 Java程序员面试宝典视频课程之常用类

    一.为什么需要包装类?包装类的作用是? 答: 因为 java 语言是面向对象的语言,但是java中的基本数据类型却不是面向对象的,而在实际的使用中经常需要将基本数据转化成对象,便于操作. 作用: 1. ...

  7. 08 Java程序员面试宝典视频课程之内部类

    一.方法内部能不能定义类? 答: 可以,是方法内部类 二.说出定义内部类的方式? 答: A.成员内部类: 1.定义在另一个类(外部类)的内部,与成员方法和属性平级,属于类 的一个成员,可以用 priv ...

  8. 20 Java程序员面试宝典视频课程之HTML5新标签、功能

    一.HTML5认识?(是什么,为什么) 答: 1.HTML5指的是包括 HTML . CSS 和 JavaScript 在内的一套技术组合. 2.HTML4陈旧不能满足日益发展的互联网需要,特别是移动 ...

  9. 10 Java程序员面试宝典视频课程之Servlet

    一.http 全称是什么? 有什么作用? 答: 1.超文本传输协议(HTTP:Hypertext Transport Protocol)是万维网应用层的协议,它通过两个程序实现:一个是客户端程序(各种 ...

最新文章

  1. ansys的kbc_ansys求解过程
  2. 使用 python 获取 httpd 程序所占用物理内存
  3. python爬虫bilibili_Python爬虫 bilibili视频弹幕提取过程详解
  4. 20 款优秀的数据可视化工具,总有一款你用的到!
  5. 其他-私人♂收藏(比赛记录 Mar, 2019)
  6. maven工程打包老是报错_maven工程pom文件老是报错
  7. 富士康有麻烦了,iPhone产能已被削减
  8. 赛锐信息:SAP img 文档
  9. NQL.Net 简介
  10. 关于加载表格及模态框数据回填的Bug
  11. nodejs开发http接口
  12. 【Ubuntu18.04】Seetaface6人脸识别部署
  13. rpcbind 、nfs无法启动问题
  14. 交换机入门书籍推荐_网络工程学习方法/路线/专业书籍推荐
  15. 2016年全国各省市高考状元详情汇总一览
  16. adc0809工作过程C语言,ADC0809引脚图、时序图、工作流程图详解
  17. mongodb不等于某个值_mongodb条件查询不等于
  18. Firefox 浏览器和burp suit 证书配置
  19. 腾讯、网易、极验、顶象滑块验证码识别
  20. 46、微信-群聊列表

热门文章

  1. html背景mov,科技常识:html5自动播放mov格式视频的实例代码
  2. bind merge r 和join_R语言数据合并
  3. mysql索引底层实现原理_mysql的索引底层之实现原理
  4. 用计算机解决问题的五个步骤,人们利用计算机解决问题的基本过程一般有如下五个步骤....docx...
  5. java二级下拉菜单_航菜单栏中的二级下拉菜单
  6. 数论题目入门 基础积攒
  7. 大数据驱动的运营创新和探索
  8. centos6.5官方dvd做本地yum
  9. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决
  10. 算法很重要,但是,并非所有,并不是每个人的选择