java 多线程相关面试题

https://www.cnblogs.com/kexianting/p/8566318.html

java 多线程

线程的生命周期

线程的生命周期包括:

新建:
线程刚刚被创建出来,new Thread()阶段

就绪:

线程创建完成,调用start() 方法

运行:

执行run() 方法里面的内容

阻塞:

遇到sleep() ,或者是线程处于被挂起的状态

消亡:

正常执行结束,就会消亡

java 线程的创建方式

  1. 继承Thread类
    Thread 继承了 Runnable 里面常用的方法

start() : 线程的启动方法
run():线程具体的执行的业务逻辑
join():线程在执行过程中可以加入
sleep(): 线程休眠的方法,不释放线程锁,其他线程无法获取锁信息
wait():线程处于等待状态同时释放锁

  1. 实现Runnable 接口

  2. 实现Callable 接口

Callable 是 线程的实现方法call 是带返回值的,通知可以使用泛型,具体使用实例如下

/**     

 * @{#} CallTest1.java Create on 2020年8月25日 下午1:44:54     

 *     

 * Copyright (c) 2013 by Logan.     

 */     

package test.thread.call;

import java.util.concurrent.Callable;

/**     

* @author jiangcl    

* @version 1.0     
* @desc

*/

public class CallTest1 implements Callable<String>{

	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("callable 接口执行力");
		return "success";
	}
	

}

/**     

 * @{#} MainTest.java Create on 2020年8月25日 下午1:46:44     

 *     

 * Copyright (c) 2013 by Logan.     

 */     

package test.thread.call;

import java.util.concurrent.FutureTask;

/**     

* @author jiangcl    

* @version 1.0     
* @desc

*/

public class MainTest {
	
	public static void main(String[] args) {
		
		CallTest1 test1 = new CallTest1();
		
		FutureTask<String> task = new FutureTask<String>(test1);
		
		new Thread(task).start();
		
		
	}

}

java 如何保证线程安全

synchronized 关键字的使用:

  1. synchronized 修饰的方法

修饰方法相当于给方法加锁,必须等方法执行完,其他的线程才能进入

/**     

 * @{#} SynTest.java Create on 2020年9月9日 下午2:16:34     

 *     

 * Copyright (c) 2013 by Logan.     

 */

package test.thread.fuc;

/**
 * 
 * @author jiangcl
 * 
 * @version 1.0
 * @desc
 * 
 */

public class SynTest implements Runnable {

	public int num = 0;
	
	public synchronized void FunTest() {
		num = num + 1;
		System.out.println(Thread.currentThread().getName() + ":" + num);
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			FunTest();
		}
	}

}

/**     

 * @{#} MainTest.java Create on 2020年9月9日 下午2:19:25     

 *     

 * Copyright (c) 2013 by Logan.     

 */     

package test.thread.main;

import test.thread.fuc.SynTest;

/**     

* @author jiangcl    

* @version 1.0     
* @desc

*/

public class MainTest {
	
	
	
	public static void main(String[] args) {
		
		SynTest synTest = new SynTest();
		Thread th1 = new Thread(synTest);
		Thread th2 = new Thread(synTest);
		th1.start();
		th2.start();
	}
	
	

}



如果不加 synchronized

在这里插入图片描述加了 synchronized 就可以获取同一个num。

  1. synchronized 修饰的代码块

synchronized 修饰的代码块 格式为

synchronized (对象){}

括号中为同一个对象时,相当于给一个对象加锁,

  1. static,synchronized同时修饰的方法:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值