大家好!尽管我已经找到了 Java 方面的工作,但我还是决定继续 Javarash 的学习。 我为自己写这个博客,非常懒惰,而且,有人可能会说,是在压力下。如果有人发现它有用,我会非常高兴,但您不应该将其用作寻找关卡问题答案的主要来源。
7. 你知道多少种创建线程的方法?(线程、可运行、可调用
1. 线程优先级是什么?
系统中的每个线程都有自己的优先级。优先级是线程对象中从 1 到 10 的某个数字,值越大表示优先级越高。系统首先执行较高优先级的线程,较低优先级的线程仅在其较高特权的对应线程空闲时才获得 CPU 时间。您可以使用两个函数来处理线程优先级:void setPriority(int priority) //устанавливает приоритет потока.
可能的优先级值为 MIN_PRIORITY、NORM_PRIORITY 和 MAX_PRIORITY。
int getPriority() // получает приоритет потока.
Source 如果未指定优先级,则线程接收优先级 5 - 中。线程优先级不会对其操作产生太大影响,但本质上是建议性的。如果有多个休眠线程需要启动,那么Java机器会先启动优先级较高的线程。Java 机器按照它认为合适的方式管理线程。低优先级线程不会空闲。他们只会比其他人获得更少的时间,但仍然会被处决。在大多数情况下,线程始终以相同的优先级运行。尝试为一个线程提供比其他线程更多的时间通常表明程序中存在体系结构错误。
2. 是否可以通过将线程的优先级降低到0来停止该线程?
不。会被抛出IllegalArgumentException
3. 为什么需要ThreadGroup类?
为了防止任何线程停止和中断一行中的所有线程,引入了“线程组”的概念。一个线程只能影响与其属于同一组的其他线程。ThreadGroup
是管理线程组的类。这种方法允许您保护线程免受不必要的更改。有时您必须运行无法 100% 信任的代码。因此,可以方便地将其所有线程放在一个单独的组中,并防止它们干扰主线程组的工作。换句话说,管理线程组
4. main-thread属于哪一组线程?
main
5.什么是ThreadPool模式
一般来说,模式ThreadPool
是解决一组问题的一组线程。任务被组织到队列中。一旦线程完成某个任务的工作,它就会从队列中请求下一个任务,直到队列中的所有任务都完成为止。此后,线程可以终止或进入休眠状态,直到队列中出现新任务。
6. 为什么需要ThreadPoolExecutor类?
用一组线程来解决大量的小问题。使用类可以避免机器资源的浪费。因为为每个任务创建自己的线程并不是很合理。Java机器为每个线程分配相当多的资源。换句话说,创建和销毁已用完的线程可能比任务本身浪费更多的资源和时间。Java 开发人员针对这个问题想出了一个优雅的解决方案——ThreadPoolExecutor
. 这个类里面有两个东西:
- 您可以将程序中出现的任务添加到其中的任务队列。
- 线程池(线程组)——执行这些任务。
7. 你知道多少种创建线程的方法?(线程、可运行、可调用
)
public class ThreadsTests {
//Способ 1
static class ThreadExampleRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
//Способ 2
static class ThreadExampleFromThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
//Способ 3
static class ThreadExampleFromCallable implements Callable{
@Override
public String call() throws Exception {
return Thread.currentThread().getName();
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
new Thread(new ThreadExampleRunnable()).start(); //Способ 1
new ThreadExampleFromThread().start(); //Способ 2
//Способ 3
ExecutorService service = Executors.newFixedThreadPool(5);
Future task = service.submit(new ThreadExampleFromCallable());
System.out.println(task.get());
}
}
8. Future 类有什么用?
该对象可用于查明任务是否已完成,并获取其执行结果。boolean cancel(boolean mayInterrupt); // Останавливает задачу.
boolean isCancelled(); //returns true, если задача была остановлена.
boolean isDone(); //returns true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //returns результат вызова метода call or кидает исключение, если оно было.
9. Callable 相对于 Runnable 的优点是什么?
使用Callable
我们可以查看任务是否完成,并查看其结果,比使用容易得多Runnable
GO TO FULL VERSION