Java中的LinkedTransferQueue tryTransfer()方法及示例
LinkedTransferQueue类的 tryTransfer() 方法是Java中的内置函数,通常用于向等待接收元素的线程传输元素,如果没有等待的线程,则将终止而不将元素添加到队列中,或者您也可以通过将时间和单位的数量作为参数传递给函数,使其等待一定的时间。
在LinkedTransferQueue类中,根据传递给它的参数,有两种类型的tryTransfer()方法。
tryTransfer(E e)
通常用于向等待状态的线程传输元素,如果没有等待的线程,则将终止而不将元素添加到队列中。
语法:
public boolean tryTransfer(E e)
参数:
- 这里 E e 是要传输到等待状态的线程的元素。
返回值: 该方法将返回一个 布尔值 ,即如果已传输元素,则为true,否则为false。
异常 : 该方法将引发以下异常。
- NullPointerException – 如果指定的元素为 null
-
InterruptedException – 如果在等待时中断,在这种情况下,该元素不会保留在队列中。
下面的程序演示了Java中简单的LinkedTransferQueue.tryTransfer()方法:
程序1: 演示Java中的tryTransfer()方法。
// Java program to demonstrate
// the tryTransfer() Method.
import java.util.*;
import java.util.concurrent.*;
class GFG {
public static void main(String args[])
{
// creating an object
// for class LinkedTransferQueue
LinkedTransferQueue<String> g
= new LinkedTransferQueue<String>();
new Thread(new Runnable() {
public void run()
{
try {
System.out.println("transferring an element");
// calling tryTransfer() method
// to transfer the string
g.tryTransfer("is a computer science portal.");
System.out.println("element transfer is complete");
}
catch (NullPointerException e2) {
System.out.println(e2);
System.exit(0);
}
}
}).start();
try {
// here the thread is waiting
// to receive an element.
System.out.println("Geeks for Geeks "
+ g.take());
}
catch (Exception e) {
System.out.println(e);
}
}
}
输出:
transferring an element
element transfer is complete
Geeks for Geeks is a computer science portal.
程序2: NullPointerException。
// Java程序演示tryTransfer() 方法抛出的NullPointerException。
import java.util.*;
import java.util.concurrent.*;
class GFG {
public static void main(String args[])
{
// 创建一个LinkedTransferQueue对象
LinkedTransferQueue<String> g
= new LinkedTransferQueue<String>();
new Thread(new Runnable() {
public void run()
{
try {
System.out.println("传输元素");
// 调用tryTransfer()方法传输空元素
g.tryTransfer(null);
System.out.println("元素传输完成");
}
catch (NullPointerException e2) {
System.out.println(e2);
System.exit(0);
}
}
}).start();
try {
System.out.println("与Geeks for Geeks交流 " + g.take());
// 这里线程正在等待接收元素。
}
catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
}
输出结果:
传输元素
java.lang.NullPointerException
tryTransfer(E e, long timeout, TimeUnit)
通常用于将元素传输给处于等待状态的线程,如果没有等待的线程,则通过将时间量和单位作为参数传递给函数来等待一定的时间量。
语法:
public boolean tryTransfer(E e, long timeout, TimeUnit)
参数: 该方法接受三个强制参数:
- 此处 E e 是要传输到等待状态线程的元素。
- 此处 long timeout 是指等待终止前等待的时间量。
- 此处 TimeUnit unit 意味着timeout的单位。
返回值: 该方法将返回一个 布尔值 。如果传输了元素,则返回true,否则返回false。
异常: 该方法将引发以下异常。
- NullPointerException - 如果指定的元素为空
-
InterruptedException - 如果等待时中断,此时未排队的元素不会被保留。
程序1: 通过将等待设置为其参数,使用Java说明tryTransfer()方法。
// Java程序演示
// tryTransfer()方法。
import java.util.*;
import java.util.concurrent.*;
class GFG {
public static void main(String args[])
{
// 创建LinkedTransferQueue对象
LinkedTransferQueue<String> g
= new LinkedTransferQueue<String>();
new Thread(new Runnable() {
public void run()
{
try {
System.out.println("传输元素");
// 调用tryTransfer()方法,将时间和单位作为参数传递给函数,并将其返回值存储在布尔变量中。
boolean a = g.tryTransfer(
"是一个计算机科学门户网站。",
2000,
TimeUnit.MILLISECONDS);
if (a)
System.out.println("元素传输完成");
else
System.out.println("元素未传输");
}
catch (NullPointerException e2) {
System.out.println(e2);
}
catch (InterruptedException e3) {
System.out.println(e3);
}
}
}).start();
try {
// 将线程休眠2000毫秒
Thread.sleep(2000);
// 此时线程已准备好接收传输的元素
System.out.println("Geeks for Geeks " + g.take());
}
catch (Exception e) {
System.out.println(e);
}
}
}
输出:
传输元素
Geeks for Geeks 是一个计算机科学门户网站。
元素传输完成
程序2: NullPointerException。
// Java程序演示tryTransfer()方法抛出的
// NullPointerException。
import java.util.*;
import java.util.concurrent.*;
class GFG {
public static void main(String args[])
{
// 为类LinkedTransferQueue创建一个对象
LinkedTransferQueue<String> g
= new LinkedTransferQueue<String>();
new Thread(new Runnable() {
public void run()
{
try {
System.out.println("传输元素");
// 调用tryTransfer()方法传递空元素
g.tryTransfer(null, 2000, TimeUnit.MILLISECONDS);
System.out.println("元素传输完成");
}
catch (NullPointerException e2) {
System.out.println(e2);
System.exit(0);
}
catch (InterruptedException e3) {
System.out.println(e3);
}
}
}).start();
try {
// 将线程休眠2000毫秒
Thread.sleep(2000);
// 此时线程已准备好接收传输的元素
System.out.println("Geeks for Geeks "
+ g.take());
}
catch (Exception e) {
System.out.println(e);
}
}
}
输出:
传输元素
java.lang.NullPointerException
参考资料:
- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html#tryTransfer(E)
- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html#tryTransfer(E,%20long,%20java.util.concurrent.TimeUnit)
极客教程