建设交通职业技术学院招聘信息网站,wordpress 网址导航插件,营山县城乡规划建设局官方网站,代做底单的网站多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程#xff0c;可以减少爬虫的运行时间#xff0c;提高效率。不过需要注意的是#xff0c;在爬取过程中需要合理的管理线程数#xff0c;以避免对被爬取的网站造成过大的负荷。
…多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程可以减少爬虫的运行时间提高效率。不过需要注意的是在爬取过程中需要合理的管理线程数以避免对被爬取的网站造成过大的负荷。
一、线程基础
1、继承Thread方式的线程
当需要再此启动一个线程时需要再创建对象不能重复使用。
2、推荐的创建线程方式继承Runnalbe使用Thread类
1.5之前就这两种 callable 第三种 可以有返回值 call() 可以抛出异常 支持泛型返回值 需要借助FutureTask 如获取返回值的时候
class MyThread implements Callable{public Object call() throws Exception{....return null;}
}MyThread thread new MyThread();
FutureTask f new FutureTask(thread);
new Thread(f).start();
new Thread(f).start(); // 反复执行不会执行需要定义新的task
try{Object ret f.get();// get()为返回值,会阻塞主线程执行
}catch(InterruptedException){}catch(Execution e){}线程池 第四种方式
提高速度降低资源消耗 便于线程管理核心池大小最大线程数没任务多长时间终止
//Executors 工具类
//ExecutorService 接口
ExecutorService service Executors.newFixedThreadPool(10);
ThreadPoolExecutor executor (ThreadPoolExecutor)service;
executor.setxxx() //设置参数
service.execute(Runnable);
service.submit(Callable);
service.shutdown();b 4、线程分类
守护线程用户线程
守护线程服务用户线程
thread.setDaemon(true) //设置为守护线程
最简单程序main主线程与gc回收线程
若没有用户线程jvm则结束
5、线程生命周期
NEW : 创建对象 RUNNABLE 运行 start BLOCKED阻塞 sleepjoin等待同步锁waitsuspend:过时方法 WAITINGwait() TIMED-WAITINGwait(time) TERMINATEDstopexceptionrun结束 阻塞—》就绪sleepjoin结束获取同步锁notifyresume过时方法
6、注意
wait阻塞会释放锁必须在synchronized内 sleep阻塞不会释放锁任何时候可以 wait,notify,notifyall,必须在同步方法快内方法内不能使用lock他们调用时是锁对象.wait要注意 此时syn(锁对象)两个所对象必须相同
二、线程同步
sync
与wait搭配notify搭配若与Lock搭配会造成异常
多用while不用if
同步代码块synchronized 自动锁
要求所有相乘同一把锁 synchronized(obj) obj是同一个对象或同一个类
同步方法当方法内容全部需要同步时
非静态方法锁即时this 需要注意
静态方法时锁时当前类本身
Lock 接口 1.5之后
condition
能够手动开启同步结束同步手动锁指定睡眠指定唤醒
实现类
ReentrantLock功能与synchronized可重入锁
ReentrantReadWriteLock.ReadLock有读锁的线程可以共享该方法几乎相当于没加锁
ReentrantReadWriteLock.WriteLock其他线程不共享该方法
ReentrantLock lock new ReentrantLock();
final Condition flag1lock.newCondition();
final Condition flag2lock.newCondition();
try{lock.lock();flag1.await();...
}finally{lock.unlock();
}
flag2.singal();三、线程通信
定制化通信
/* 例
* 切菜
* 炒菜
* 上菜
* 同时10道菜
*/
// 这里就不能用sync需要定制化通信唤醒睡眠的线程
// 顺序线程 操作 资源类
CookingLockcondation flag1flag2flag3cut()cooking()gaving()
Cookingnew thread(()-{for(int i0;i5;i)cooking.cut();}).start()new thread(()-{for(int i0;i5;i)cooking.cooking();}).start()new thread(()-{for(int i0;i5;i)cooking.giving();}).start()lambda表达式 接口可写静态方法实现 普通方法实现加default 关键字即可
四、JUC工具类
数据库中读写一般不是同步的
JUC中读写都是同步的即读写同步因为JVM线程必须加锁否则不安全比数据库严格
ReentraReadWriteLock读写锁写程序优先
CountDownLatch计数器
CountDown count new CountDown(10);
count.await(); // 到此方法时会判断count里面的数值为0时继续主线程适用于秒杀业务CyclicBarrier循环栅栏多个线程处于同一状态时才继续CyclicBarrier任务。
CyclicBarrier cyc new CyclicBarrier(7,任务)for (int i0;i7;i)new Thread(){()-{xxxxxcyc.await(); }}Semaphere信号灯
Sempahere s new Semaphere(3);for (int i0;i7;i)new Thread(){()-{s.acquire();// 资源不够时会阻塞xxxxs.release();// 表示释放了资源}}