java多线程访问被限制问,高分求助 高手给个思路或方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程访问被限制问,高分求助 高手给个思路或方法相关的知识,希望对你有一定的参考价值。
一个java多线程的小程序,有时候在访问百-度时候会报错:很抱歉,您的电脑或所在的局域网络有异常的访问,此刻我们无法响应您的请求。 请输入以下验证码,即可恢复使用。这个情况应该怎么解决呢,求高手给个思路或方法.
参考技术A 应该是百度的防止恶意攻击功能起作用了;在HttpClient 请求时,模拟浏览器和客户端IP地址,要努力伪装成像人在发出Url请求。 参考技术B 伪装Ip是没用的,大点的应用都是通过mark地址的。你可以保存返回页面缓存至本地的方法解决。 参考技术C 这是百度为了防止恶意攻击做的一个小过滤,不是你的问题,要修改只能从伪装自己ip来下手本回答被提问者采纳java 多线程 同时操作一个变量 高分悬赏
高分悬赏,追加分。
问题描述
我需要两个线程访问同一个List。
一个线程不停的往List中add数据。
一个线程往外get数据,get一条,remove一条。
怎样写:(等待高手改造)
public class Test
public static List list = new ArrayList();
public static void main(String[] args)
myThreadClass1 thread1 = new myThreadClass1();
myThreadClass2 thread2 = new myThreadClass2();
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
class myThreadClass1 implements Runnable
public void run()
while(1 == 1)
Test.list.add("123");
class myThreadClass2 implements Runnable
public void run()
if(Test.list.size() > 0)
for(Object ss:Test.list)
System.out.println(ss);
Test.list.remove(ss);
public class Test
public static List<String> list = new ArrayList<String>();
public static void main(String[] args)
myThreadClass1 thread1 = new myThreadClass1();
myThreadClass2 thread2 = new myThreadClass2();
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
class myThreadClass1 implements Runnable
public void run()
while (true) // 这就不要写1 ==1 了
synchronized (Test.class)
System.out.println("add!!!!");
Test.list.add("123");
try
Thread.sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
class myThreadClass2 implements Runnable
public void run()
while (true)
synchronized (Test.class)
Iterator it = Test.list.iterator();
// 循环里remove会出冲突异常的
List list2 = new ArrayList();
while (it.hasNext())
Object obj = it.next();
System.out.println("remove:" + obj);
list2.add(obj);
// you can do anything with list2
// avoid java.util.ConcurrentModificationException
Test.list.clear();
try
Thread.sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
参考技术A 前面的回答我都看了一下,都存在问题。
下面我对你的代码进行了修改,如果有问题,请回复。
需要对list进行同步,保证只有一个线程在操作list。
class myThreadClass1 implements Runnable
public void run()
while(1 == 1)
synchronized (Test.list)
Test.list.add("123");
Thread.yield(); // 别让他老是占着CPU啊
在向外取的时候,不允许别人向里加,所以需要同步list。
class myThreadClass2 implements Runnable
public void run()
while (true)
synchronized (Test.list)
if (!Test.list.isEmpty())
String item = Test.list.get(0);
System.out.println(item);
Test.list.remove(0);
Thread.yield(); // 别让他老是占着CPU啊
参考技术B public class ListThread
static int n = 0;
public static void main(String[] args)
final List<String> list = new ArrayList<String>();
new Thread(new Runnable()
public void run()
while (true)
String str = "add" + n;
list.add(str);
System.out.println("add :" + str);
n++;
try
Thread.sleep(10);
catch (InterruptedException ex)
Logger.getLogger(ListThread.class.getName()).log(Level.SEVERE, null, ex);
).start();
new Thread(new Runnable()
public void run()
while (true)
if (!list.isEmpty())
try
Thread.sleep(10);
catch (InterruptedException ex)
Logger.getLogger(ListThread.class.getName()).log(Level.SEVERE, null, ex);
String str = list.remove(list.size() - 1);
System.out.println("remove :" + str);
n--;
).start();
try
Thread.sleep(100000);
catch (InterruptedException ex)
Logger.getLogger(ListThread.class.getName()).log(Level.SEVERE, null, ex);
同步不是关键,因为你对list的操作都是原子操作,在这个添加、删除过程是不会被其他线程打断超过的,所谓的同步其实是对可能被人打断的动作进行同步,就是说你在提交数据过程如果你这个过程一直是连续的那就没必要同步,但是如果你在提交过程中需要让出cpu,交给其他线程那就要同步,而且必须同步。你说的这种都是原子动作,只是当动作完毕之后才会让人家删除,所以不会有线程问题。
还有一点对于list的操作能够使用get set 就不要使用foreach来操作。foreach要求在遍历过程中不能删除、添加list。推荐使用for循环来遍历list,这样是要关注索引就可以了。 参考技术C public class Test
public static List list = new ArrayList();
public static void main(String[] args)
Test tt = new Test();
myThreadClass1 thread1 = tt.new myThreadClass1();
myThreadClass2 thread2 = tt.new myThreadClass2();
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
private synchronized Object getList(int index)
return list.get(index);
private synchronized List getLists()
return list;
private synchronized void setList(Object obj)
Test.list.add(obj);
private synchronized void removeList(int index)
Test.list.remove(index);
class myThreadClass1 implements Runnable
public void run()
int i = 0;
while (1==1)
i++;
setList("第一个------>" + i);
System.out.println("第一个------>" + i);
class myThreadClass2 implements Runnable
public void run()
while(1==1)
if(list.size() > 0)
for(int i = 0; i < getLists().size() ; i++)
System.out.println("移除———————>"+getList(i));
removeList(i);
else
try
Thread.sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
本回答被提问者采纳 参考技术D import java.util.ArrayList;
import java.util.List;
public class Test
public static List<String> list = new ArrayList<String>();
public static void main(String[] args)
myThreadClass1 thread1 = new myThreadClass1();
myThreadClass2 thread2 = new myThreadClass2();
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
class myThreadClass1 implements Runnable
public void run()
int num = 0;
while(true)
num ++;
String data = num+"";
System.out.println("添加="+data);
Test.list.add(data);
try
Thread.sleep(80);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
class myThreadClass2 implements Runnable
public void run()
while(true)
if(Test.list.size() > 0)
System.out.println("删除="+Test.list.get(0));
Test.list.remove(0);
else
System.out.println("线程2 暂无数据");
try
Thread.sleep(80);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
可以看输出 同意改变2个线程 比如1号线程40 2号80就会出现添加2个删除1个 反过来就会出现添加一个 删除一个 还有一个没有数据的提示
我是aa88567414换号了
以上是关于java多线程访问被限制问,高分求助 高手给个思路或方法的主要内容,如果未能解决你的问题,请参考以下文章