java面试题-Java基础部分-基础语法 51-56

本文深入探讨Java线程的基础概念,包括线程的启动、基本状态及其转换,同步与并发控制机制,如synchronized与Lock的区别。并提供实战案例,如设计多个线程对共享变量进行增减操作及子主线程交替执行的程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础语法 51-56

51 、启动一个线程是用 run() 还是 start()? .

52、当一个线程进入一个对象的 、当一个线程进入一个对象的一个 一个 synchronized 方法后,其它线程是否可 方法后,其它线程是否可进入此对象的其它方法 进入此对象的其它方法?

53、 、线程的基本概念、线程的基本状态以及状态之间的关系

54 、简述 synchronized 和 和 java.util.concurrent.locks.Lock  的异同?

55 、设计 4  个线程,其中两个线程每次对 j  增加 1 ,另外两个线程对 j 每次减少 每次减少1 。写出程序。

56 、子线程循环 10  次,接着主线程循环 100 ,接着又回到子线程循环 10 次, 次,接着再回到主线程又循环 接着再回到主线程又循环 100 ,如此循环 50  次,请写出程序。


51 、启动一个线程是用 run() 还是 start()? .


启动一个线程是调用 start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。


52、当一个线程进入一个对象的 、当一个线程进入一个对象的一个 一个 synchronized 方法后,其它线程是否可 方法后,其它线程是否可进入此对象的其它方法 进入此对象的其它方法?

分几种情况:
1. 其他方法前是否加了 synchronized 关键字,如果没加,则能。
2. 如果这个方法内部调用了 wait,则可以进入其他 synchronized 方法。
3. 如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不能。
4. 如果其他方法是 static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是 this。

53、 、线程的基本概念、线程的基本状态以及状态之间的关系

程序(Program):程序的为了让计算机执行某些操作或解决某个问题而编写一系列有序的指令集合。软件的目的:提高人们的工作效率,简化工作流程。动态概念。

进程(Process):进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 动态概念。

线程(Thread):是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。 可以看成是进程内的多条执行路径。

线程的基本概念、线程的基本状态以及状态之间的关系一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即 main 方法执行的那个线程。如果只是一个 cpu,它怎么能够同时执行多段程序呢?

这是从宏观上来看的,cpu 一会执行 a 线索,一会执行 b 线索,切换时间很快,给人的感觉是a,b 在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为 a 传数据,一会为 b 传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。


状态:就绪,运行,synchronize 阻塞,wait 和 sleep 挂起,结束。wait 必须在 synchronized内部调用。
调用线程的 start 方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到 synchronized 语句时,由运行状态转为阻塞,当 synchronized 获得锁后,由阻塞转为运行,在这种情况可以调用 wait 方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。


54 、简述 synchronized 和 和 java.util.concurrent.locks.Lock  的异同?


主要相同点:Lock 能完成 synchronized 所实现的所有功能
主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且必须在 finally 从句中释放。Lock 还有更强大的功能,例如,它的 tryLock 方法可以非阻塞方式去拿锁。

举例说明(对下面的题用 lock 进行了改写):
 

package com.sxy.cn.thread.test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest {

	private int j;
	private Lock lock = new ReentrantLock();

	public static void main(String[] args) {
		ThreadTest tt = new ThreadTest();
		for (int i = 0; i < 2; i++) {
			new Thread(tt.new Adder()).start();
			new Thread(tt.new Subtractor()).start();
		}
	}

	private class Subtractor implements Runnable {
		@Override
		public void run() {
			while (true) {
				lock.lock();
				try {
					System.out.println("j--=" + j--);
				} finally {
					lock.unlock();
				}
			}
		}
	}

	private class Adder implements Runnable {
		@Override
		public void run() {
			while (true) {
				lock.lock();
				try {
					System.out.println("j++=" + j++);
				} finally {
					lock.unlock();
				}
			}
		}
	}
}


55 、设计 4  个线程,其中两个线程每次对 j  增加 1 ,另外两个线程对 j 每次减少 每次减少1 。写出程序。


 

package com.sxy.cn.thread.test;

public class ThreadTest1 {
	private int j;

	public static void main(String args[]) {
		ThreadTest1 tt = new ThreadTest1();
		Inc inc = tt.new Inc();
		Dec dec = tt.new Dec();
		for (int i = 0; i < 2; i++) {
			Thread t = new Thread(inc);
			t.start();
			t = new Thread(dec);
			t.start();
		}
	}

	private synchronized void inc() {
		j++;
		System.out.println(Thread.currentThread().getName() + "-inc:" + j);
	}

	private synchronized void dec() {
		j--;
		System.out.println(Thread.currentThread().getName() + "-dec:" + j);
	}

	class Inc implements Runnable {
		public void run() {
			for (int i = 0; i < 100; i++) {
				inc();
			}
		}
	}

	class Dec implements Runnable {
		public void run() {
			for (int i = 0; i < 100; i++) {
				dec();
			}
		}
	}
}


56 、子线程循环 10  次,接着主线程循环 100 ,接着又回到子线程循环 10 次, 次,接着再回到主线程又循环 接着再回到主线程又循环 100 ,如此循环 50  次,请写出程序。


 

package com.sxy.cn.thread.test;

public class ThreadTest2 {

	public static void main(String[] args) {
		new ThreadTest2().init();
	}

	public void init() {
		final Business business = new Business();
		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 50; i++) {
					business.SubThread(i);
				}
			}
		}).start();
		for (int i = 0; i < 50; i++) {
			business.MainThread(i);
		}
	}

	private class Business {
		boolean bShouldSub = true;// 这里相当于定义了控制该谁执行的一个信号灯

		public synchronized void MainThread(int i) {
			if (bShouldSub)
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			for (int j = 0; j < 5; j++) {
				System.out.println(Thread.currentThread().getName() + ":i=" + i + ",j=" + j);
			}
			bShouldSub = true;
			this.notify();
		}

		public synchronized void SubThread(int i) {
			if (!bShouldSub)
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			for (int j = 0; j < 10; j++) {
				System.out.println(Thread.currentThread().getName() + ":i=" + i + ",j=" + j);
			}
			bShouldSub = false;
			this.notify();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值