Java 线程和同步
我需要为以下内容创建一个java程序:Java 线程和同步,java,eclipse,thread-synchronization,Java,Eclipse,Thread Synchronization,我需要为以下内容创建一个java程序: 创建一个ArrayList来存储员工的姓名 创建两个同步方法,将员工姓名添加到ArrayList并打印员工姓名 两个线程完成添加员工后,打印员工姓名 我已经做了以下操作,但它不起作用。它在“pr.print(X)”行出现异常。有人能帮忙吗?这不是我的作业!!!我只是在努力学习 import java.util.*; public class Ch5Ex2 { public static void main(String[] args) {
import java.util.*;
public class Ch5Ex2
{
public static void main(String[] args)
{
List<String> li = new ArrayList<String>();
Print pri = new Print();
pri.start();
Insert in = new Insert(li);
in.start();
}
}
class Insert extends Thread
{
Print pr = new Print();
List<String> x;
public Insert(List<String> x)
{
this.x = x;
}
public synchronized void run()
{
try
{
x.add("robin");
x.add("ravi");
x.add("raj");
pr.print(x);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Print extends Thread
{
List<String> y;
public void print(List<String> y)
{
this.y = y;
notify();
}
public synchronized void run()
{
try
{
wait();
for(int i=0;i<y.size();i++)
{
System.out.println(y.get(i));
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.util.*;
公共类Ch5Ex2
{
公共静态void main(字符串[]args)
{
List li=new ArrayList();
打印优先级=新打印();
pri.start();
插入=新插入(li);
in.start();
}
}
类插入扩展线程
{
打印pr=新打印();
清单十;
公共插入(列表x)
{
这个.x=x;
}
公共同步的无效运行()
{
尝试
{
x、 添加(“罗宾”);
x、 添加(“ravi”);
x、 添加(“raj”);
公共印刷品(x);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
}
类打印扩展线程
{
列表y;
公共作废打印(列表y)
{
这个。y=y;
通知();
}
公共同步的无效运行()
{
尝试
{
等待();
对于(int i=0;i我猜pr
在Insert
类中为空,您永远不会调用构造函数。我猜pr
在Insert
类中为空,您永远不会调用构造函数。为了让您的生活更轻松,您可能会忘记应用程序级别的同步,只需通过c创建同步的ArrayList
所有到集合#synchronizedList()
如下
List yourArray=Collections.synchronizedList(新的ArrayList())
在这种情况下,来自不同线程的对yourArray
的所有调用都将同步。
除此之外,pr
看起来是空的,因为你从来没有实例化过它(多亏了尼古拉·库兹涅佐夫)。为了让你的生活更轻松,你可能会忘记应用程序级的同步,只需通过调用集合#synchronizedList()
创建同步化的ArrayList
List yourArray=Collections.synchronizedList(新的ArrayList())
在这种情况下,来自不同线程的对yourArray
的所有调用都将同步。
除此之外,pr
看起来是空的,因为你从来没有实例化过它(多亏了尼古拉·库兹涅佐夫).您没有为pr分配内存。您只是创建了一个可变打印pr。因此,您必须获得NPE您没有为pr分配内存。您只是创建了一个可变打印pr。因此,您必须获得NPE我认为您需要:
import java.util.*;
public class Ch5Ex2 {
public static void main(String[] args) {
List<String> li = new ArrayList<String>();
Print pri = new Print();
pri.start();
Insert in = new Insert(li, pri);
in.start();
}
}
class Insert extends Thread {
Print pr;
List<String> x;
public Insert(List<String> x, Print p) {
this.x = x;
pr = p;
}
public synchronized void run() {
try{
x.add("robin");
x.add("ravi");
x.add("raj");
pr.print(x);
} catch(Exception e) {
e.printStackTrace();
}
}
}
class Print extends Thread {
List<String> y;
public synchronized void print(List<String> y) {
this.y = y;
notify();
}
public synchronized void run() {
try {
while(y == null){
wait();
}
for(int i=0;i<y.size();i++) {
System.out.println(y.get(i));
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
import java.util.*;
公共类Ch5Ex2{
公共静态void main(字符串[]args){
List li=new ArrayList();
打印优先级=新打印();
pri.start();
插入=新插入(li,pri);
in.start();
}
}
类插入扩展线程{
印刷公关;
清单十;
公共插入(列表x,打印p){
这个.x=x;
pr=p;
}
公共同步的无效运行(){
试一试{
x、 添加(“罗宾”);
x、 添加(“ravi”);
x、 添加(“raj”);
公共印刷品(x);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类打印扩展线程{
列表y;
公共同步作废打印(列表y){
这个。y=y;
通知();
}
公共同步的无效运行(){
试一试{
while(y==null){
等待();
}
对于(int i=0;i我认为您需要:
import java.util.*;
public class Ch5Ex2 {
public static void main(String[] args) {
List<String> li = new ArrayList<String>();
Print pri = new Print();
pri.start();
Insert in = new Insert(li, pri);
in.start();
}
}
class Insert extends Thread {
Print pr;
List<String> x;
public Insert(List<String> x, Print p) {
this.x = x;
pr = p;
}
public synchronized void run() {
try{
x.add("robin");
x.add("ravi");
x.add("raj");
pr.print(x);
} catch(Exception e) {
e.printStackTrace();
}
}
}
class Print extends Thread {
List<String> y;
public synchronized void print(List<String> y) {
this.y = y;
notify();
}
public synchronized void run() {
try {
while(y == null){
wait();
}
for(int i=0;i<y.size();i++) {
System.out.println(y.get(i));
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
import java.util.*;
公共类Ch5Ex2{
公共静态void main(字符串[]args){
List li=new ArrayList();
打印优先级=新打印();
pri.start();
插入=新插入(li,pri);
in.start();
}
}
类插入扩展线程{
印刷公关;
清单十;
公共插入(列表x,打印p){
这个.x=x;
pr=p;
}
公共同步的无效运行(){
试一试{
x、 添加(“罗宾”);
x、 添加(“ravi”);
x、 添加(“raj”);
公共印刷品(x);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类打印扩展线程{
列表y;
公共同步作废打印(列表y){
这个。y=y;
通知();
}
公共同步的无效运行(){
试一试{
while(y==null){
等待();
}
对于(int i=0;iI现在实例化了pr,但它没有打印任何东西。我现在实例化了pr,但它没有打印任何东西。为什么我在做了所有事情后只是问一个小问题,而我的帖子却被投了反对票?@NikolayKuznetsov我实例化了pr,但现在它没有打印任何东西。我没有投反对票,但NPE会准确地告诉我这句话是什么意思发生这种情况时,你可以很容易地解决它,相反,你在这里转储代码。@NikolayKuznetsov我说我按照你的要求实例化了pr。我不再得到NPE,但也没有得到输出。我只是在寻求帮助。为什么我在做了所有事情后只问一个小问题时,我的帖子会得到反对票?@NikolayKuznetsov我实例化了pr,但现在它没有打印任何东西。我没有否决投票,但NPE会准确地告诉它发生在哪一行,所以你可以很容易地解决它,相反,你在这里转储代码。@NikolayKuznetsov我说我按照你的要求实例化了pr。我不再得到NPE,但也没有得到输出。我只是问一下正在查找帮助。您是否尝试运行上述代码?请再试几次。此外,这不是正确的解决方案,但如果在插入线程之前启动打印线程,则该解决方案必须有效。我正在获取输出。好的,我在删除等待和通知时获得了答案…我将找到正确放置它们的位置,然后查看是否仍然获得答案…谢谢:)你试过运行上面的代码吗?再试几次..这也是