当前位置: 首页 > news >正文

农家乐网站 建设烟台网站建设 58

农家乐网站 建设,烟台网站建设 58,鞍山在网络做推广,html5大气网站文章目录1. 不使用wait/notify机制通信的缺点2. 什么是wait/notify机制3. wait/notify机制原理4. wait/notify方法的基本用法5. 线程状态的切换6. interrupt()遇到方法wait()7. notify/notifyAll方法8. wait(long)介绍9. 生产者/消费者模式10. 管道机制11. 利用wait/notify实现… 文章目录1. 不使用wait/notify机制通信的缺点2. 什么是wait/notify机制3. wait/notify机制原理4. wait/notify方法的基本用法5. 线程状态的切换6. interrupt()遇到方法wait()7. notify/notifyAll方法8. wait(long)介绍9. 生产者/消费者模式10. 管道机制11. 利用wait/notify实现交叉备份12. 方法Sleep()和wait()的区别线程是操作系统中独立的个体但这些个体如果不经过特殊的处理时不能成为一体的。线程间的通信就是使线程称为整体的必用方案之一可以说使线程之间进行通信后系统之间的交互性会更大CPU利用效率得以大幅提升同时程序员在处理过程中可以有效把控于监督各线程任务。1. 不使用wait/notify机制通信的缺点 下面模拟不使用wait/notify机制进行通信然后分析其缺点所在 public class multithreadingtest {static volatile private List listnew ArrayList() ; //TODO 使用volatile修饰可以实现线程之间数据的可见性public static void main(String[] args) {Thread thread1new Thread(new Runnable() { //TODO 线程thread1实现循环向list中添加元素Overridepublic void run() {int i1;while(i0){list.add(i); //TODO 向集合中添加元素System.out.println(添加了i个元素);i;try {Thread.sleep(1000); //TODO 这里睡眠是为了等待Thread2执行} catch (InterruptedException e) {e.printStackTrace();}}}});Thread thread2new Thread(new Runnable() { //TODO 线程thread2判读集合中元素中的数量是否达到了5Overridepublic void run() {try {while(true){if(list.size()5){System.out.println(thread2要退出了);throw new InterruptedException(); //TODO 以抛出异常的方式结束线程}}}catch (InterruptedException e){e.printStackTrace();}}});thread1.setName(thread1);thread2.setName(thread2); //TODO 设置进程名thread1.start();thread2.start();}}分析代码这里的线程间通信是指thread1向集合中添加的数据达到5个后通知线程2结束。虽然两个线程以集合为媒介完成了通信但还存在缺点thread2需要使用while循环不断轮询检测某一个条件这样会很浪费CPU资源所以需要引入一种机制在减少CPU资源浪费的同时还可以实现在多个线程之间的通信这就是wait/notify机制。 2. 什么是wait/notify机制 wait/notify机制是Java中用于线程间通信的一种机制。它基于“监视器对象”monitor object的概念通过在多个线程之间共享一个对象锁来实现线程的协作。在wait/notify机制中线程可以调用对象的wait()方法来阻塞自己直到其他线程调用同一个对象的notify()或notifyAll()方法来唤醒它。当一个线程调用wait()方法时它会释放对象的锁使其他线程能够获取该对象的锁并执行相应的操作。当其他线程调用notify()或notifyAll()方法时它们会唤醒等待在该对象上的线程使它们重新竞争对象的锁继续执行操作。使用wait/notify机制可以实现一些复杂的线程协作模式比如生产者消费者模式、读写锁模式等。但是在使用过程中需要特别注意避免死锁、竞态条件等问题。 3. wait/notify机制原理 注意拥有相同锁的线程才可以实现wait/notify机制。 wait()方法 wait()Object类的方法它的作用是使当前执行该方法的进程进行等待在wait()所在的代码处暂停执行并释放锁 在调用wait之前该线程必须要获得该对象的对象级别锁如果wait之前没有持有适当的锁抛出IllegalMonitorStateException通过通知机制使得某个线程继续执行wait方法后面的代码对线程的选择是按wait方法的顺序确定的可能多个线程wait的情况 notify()方法 该方法用于唤醒当前正在wait的线程对线程的选择是按wait方法的顺序确定的 调用notigy方法必须是在同步方法或同步块中调用即调用之前也要获得锁否则抛出IllegalMonitorStateException执行notify方法后当前线程不会立即释放该锁而是等到执行notify方法的线程将同步区代码全部执行完毕后才释放锁 4. wait/notify方法的基本用法 wait()方法使当前线程暂停运行并释放锁 模拟一模拟未获取锁执行wait方法 public static void main(String[] args) throws InterruptedException {String namenew String();name.wait();}2. 模拟二wait()方法的正确使用 public static void main(String[] args) throws InterruptedException {String namenew String();synchronized (name){System.out.println(wait前);name.wait();System.out.println(wait后);}}3. 模拟三wait/notify机制的使用 public static void main(String[] args) throws InterruptedException {Thread thread1new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(thread1跑起来了);try {list.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(thread1跑完了);}}});Thread thread2new Thread(new Runnable() {Overridepublic void run() {synchronized (list){System.out.println(thread2跑起来了);list.notify();System.out.println(thread2跑完了);}}});thread1.start();Thread.sleep(3000);thread2.start();}除了notify()方法外还有一个notifyAll()方法该方法执行后会按照执行wait()方法的倒序依次唤醒“全部”的线程 5. 线程状态的切换 Thread中存在着很多的方法可以改变线程对象的状态 创建一个新的线程对象后再调用它的start()方法系统会为该线程分配CPU资源处于可运行状态就绪状态这个一个准备运行的状态如果线程抢占倒cpu资源就会转移到运行状态可运行状态和运行状态是可以相互切换的。运行状态的线程可能会被高优先级的线程抢占资源从而进入就绪态线程进入可运行状态的情况 调用sleep方法超过指定休眠时间线程获得了同步监视器锁线程在等待某个通知而相应的线程发送了通知处于挂起等待状态的线程调用了resume方法 暂停等待状态结束后线程进入可运行状态等待系统分配资源出现阻塞的情况大体分为5种 线程调用Sleep方法主动放弃占用的处理器资源线程调用了阻塞式I/O方法即线程忙着处理I/O操作了在该方法返回前线程被阻塞线程尝试获取某个对象的锁但锁被占用线程等待某个通知程序调用了suspend方法将该线程挂起此方法容易导致死锁尽量避免 run方法执行完毕后进入线程销毁阶段整个线程执行完毕 Sleep()方法和wait()方法一样也会让线程陷入阻塞但sleep并不会让持有锁的线程释放锁而锁陷入等待这是一种同步效果 6. interrupt()遇到方法wait() 当线程调用wait()方法后再对该线程对象执行interrupt()方法时会出现InterruptedException异常 public static void main(String[] args) throws InterruptedException {Thread thread1new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(thread1跑起来了);try {list.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(thread1跑完了);}}});thread1.start();thread1.interrupt();}7. notify/notifyAll方法 每次调用notify方法只通知一个线程进行唤醒唤醒的顺序按执行wait()方法的正序。 public static void main(String[] args) throws InterruptedException {Thread thread1new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(第一个wait);try {list.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}list.notify();System.out.println(第一个结束);}}});Thread thread2new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(第二个wait);try {list.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}list.notify();System.out.println(第二个结束);}}});Thread thread3new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(第三个wait);try {list.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}list.notify();System.out.println(第三个结束);}}});Thread thread4new Thread(new Runnable() {Overridepublic void run() {synchronized (list){System.out.println(开始通知);list.notify();System.out.println(通知结束);}}});thread1.start();thread2.start();thread3.start();Thread.sleep(3000);thread4.start();}总结 执行notify方法后按照wait执行顺序唤醒其它进行执行同步代码块临界区过程中遇到异常而导致线程终止时锁也会被释放执行临界区代码中执行了锁所属对象的wait方法线程会释放对象锁等待被唤醒 nofity一次调用只能唤醒一个线程所以容易出现部分线程对象没有被唤醒的情况。为了唤醒全部线程可以使用notifyAll方法它会按照执行wait方法的倒序一次对线程进行唤醒的。 8. wait(long)介绍 带有一个参数的wait(long)方法的功能是等待某一个时间内是否有线程进行通知唤醒如果超过这个时间则自动唤醒。能继续向下运行的前提是再次持有锁。注意也是可以在long时间内被其它线程唤醒的 public static void main(String[] args) throws InterruptedException {Thread thread1new Thread(new Runnable() {Overridepublic void run() {synchronized (list) {System.out.println(开始时间System.currentTimeMillis());try {list.wait(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(开始时间System.currentTimeMillis());}}});thread1.start();}9. 生产者/消费者模式 生产者/消费者模式在一个系统中存在生产者和消费者两种角色他们通过内存缓冲区进行通信生产者生产消费者需要的资料消费者把资料做成产品。wait/notify机制最经典的案例“生产者与消费者模式”模式。 案例一单生产者和单消费者模式 一个生产者生产一个消费者消费没有产品时生产者才能生产有产品时消费者才能消费 //消费者 public class P {private String lock;public P(String lock){super();this.locklock;}public void GetValue(){try{synchronized (lock){if(ValueObject.value.equals()){ //value不为空说明消费者还没有消费所以生产者需要等待lock.wait();}System.out.println(我现在要开始消费了);lock.notify();System.out.println(消费的产品ValueObject.value);ValueObject.value;}} catch (InterruptedException e) {throw new RuntimeException(e);}} } //生产者 public class C {private String lock;public C(String lock){super();this.locklock;}public void SetValue(){try{synchronized (lock){if(!ValueObject.value.equals()){ //value不为空说明消费者还没有消费所以生产者需要等待lock.wait();}System.out.println(我现在要开始生产了);lock.notify();String value String.valueOf(System.currentTimeMillis())_String.valueOf(System.nanoTime());System.out.println(生产的产品value);ValueObject.valuevalue;}} catch (InterruptedException e) {throw new RuntimeException(e);}} } //消费者线程 public class ThreadB extends Thread{private P p;public ThreadB(P p){super();this.pp;}Overridepublic void run(){while(true){ //消费者消费p.GetValue();}} } //生产者线程 public class ThreadA extends Thread{private C c;public ThreadA(C c){super();this.cc;}Overridepublic void run(){while(true){ //生产者不断生产c.GetValue();}} } //main函数public static void main(String[] args) {String locknew String();P pnew P(lock);C cnew C(lock);ThreadA threadAnew ThreadA(p);ThreadB threadBnew ThreadB(c);threadA.start();threadB.start();}案例二多生产者和多消费者模式的问题 在上面案例代码的基础上多增加生产者使得生产者的数据远远大于消费者会出现连续生产的问题导致生产的内容会发生覆盖而消费者的数量远远大于生产者的数量时会发生消费者消费空值的情况。原因是if条件发生改变时其它的线程并不知道。同时还会出现唤醒同类的情况最终出现连续生产或连续消费导致程序的逻辑出现错误。解决这个问题的方法就是把if判断改为while判断。 写覆盖代码 public class multithreadingtest {public static void main(String[] args) {String locknew String();P pnew P(lock);C cnew C(lock);ThreadA[] pThreadnew ThreadA[20];ThreadB[] rThreadnew ThreadB[20];for (int i 0; i 20; i) {pThread[i]new ThreadA(c);pThread[i].setName(生产者(i1));pThread[i].start();}for (int i 0; i 2; i) {rThread[i]new ThreadB(p);rThread[i].setName(消费者(i1));rThread[i].start();}} }消费空值代码 public class multithreadingtest {public static void main(String[] args) {String locknew String();P pnew P(lock);C cnew C(lock);ThreadA[] pThreadnew ThreadA[20];ThreadB[] rThreadnew ThreadB[20];for (int i 0; i 2; i) {pThread[i]new ThreadA(c);pThread[i].setName(生产者(i1));pThread[i].start();}for (int i 0; i 20; i) {rThread[i]new ThreadB(p);rThread[i].setName(消费者(i1));rThread[i].start();}} }将多生产多消费情况下的if判断条件改为while就不会出现连续生产和连续消费问题即使唤醒同类线程还是会执行while判断条件如果条件为true则执行wait方法避免了连续生产和连续消费的情况但程序运行过程中却出现了假死也就是所有的线程都呈现等待状态。“假死”的现象就是线程进入等待状态如果全部线程都进入了等待状态程序就不执行任何业务功能了整个项目呈现等待状态。 上面的情况用一种简单情形解释老爸老妈都会做饭你和你哥都要吃饭。老妈做完饭通知你和你哥吃饭然后去休息释放锁开始等待老爸一看饭做好了不用他去做了就去休息了生产者唤醒生产者线程你哥还是下班的路上你先去吃饭结果吃完了然后还没心没肺的通知哥回来吃饭消费者线程唤醒消费者线程你哥到家后一看没有饭也去休息了这样所有的线程都休息了所以出现了假死。假死出现的极大可能原因是连续唤醒了同类。解决假死的方法就是将notify通知换为notifyAll通知这样就能顺利解决假死问题。 10. 管道机制 管道机制是线程之间消息传递的一种机制Java语言提供了各种各样的输入输出流使我们能够很方便地操作数据其中管道流是一种特殊的流用于在不同线程间之间传送数据。一个线程发送数据输出到管道另一个线程从输入管道中读数据通过使用管道实现不同线程间的通信而无须借助与临时文件之类的东西。 测试一在管道中传递字节流 //输入管道 public class wirteMethod {public void writMethod(PipedOutputStream out) //参数为管道{try {System.out.println(wirte:);for (int i 0; i 300; i) {String outData (i 1);out.write(outData.getBytes()); //向管道中写System.out.print(~~~outData);}System.out.println();out.close();} catch (IOException e) {throw new RuntimeException(e);}} } //输出管道 public class ReadDate {public void readMethod(PipedInputStream input){try{System.out.println(read:);byte[] byteArraynew byte[20];int readLengthinput.read(byteArray);while (readLength!-1){String newDatanew String(byteArray,0,readLength);System.out.print(____newData);readLengthinput.read(byteArray);}System.out.println();input.close();} catch (IOException e) {throw new RuntimeException(e);}} } //输入线程 public class ThreadA extends Thread{private wirteMethod wirteMethod;private PipedOutputStream pipedOutputStream;public ThreadA(wirteMethod wirteMethod,PipedOutputStream pipedOutputStream){super();this.wirteMethodwirteMethod;this.pipedOutputStreampipedOutputStream;}Overridepublic void run(){wirteMethod.writMethod(pipedOutputStream);} } //输出线程 public class ThreadB extends Thread{private ReadDate readDate;private PipedInputStream pipedInputStream;public ThreadB(ReadDate readDate,PipedInputStream pipedInputStream){super();this.readDatereadDate;this.pipedInputStreampipedInputStream;}Overridepublic void run(){readDate.readMethod(pipedInputStream);} } //测试 public class multithreadingtest {public static void main(String[] args) throws IOException, InterruptedException {wirteMethod wirteMethodnew wirteMethod();ReadDate readDatenew ReadDate();PipedInputStream inputStreamnew PipedInputStream();PipedOutputStream outputStreamnew PipedOutputStream();inputStream.connect(outputStream);outputStream.connect(inputStream); //使两个管道之间产生通信链接ThreadB readThreadnew ThreadB(readDate,inputStream); //读线程先准备readThread.setName(read);readThread.start();Thread.sleep(2000);ThreadA wirteThreadnew ThreadA(wirteMethod,outputStream);wirteThread.setName(witte);wirteThread.start();} }从输出结果可以看出首先是读线程启动由于当前管道中没有数据被写入所以线程阻塞知道有数据写入才继续向下运行 测试二在管道中传递字符流基本同上这里就不演示了 11. 利用wait/notify实现交叉备份 利用wati/notify机制实现交叉备份创建20个线程其中10个线程是向数据库A中备份数据另外10个线程向数据库B中备份数据要满足备份工作是交叉进行的往A备份然后下次往B备份轮流交叉重点是如何利用wait/notify让20个线程变得有序 //备份数据的代码。 public class DBTools {volatile private boolean prevIsafalse; //信号量synchronized public void backupA(){ //A备份try {while(prevIsatrue){ //prevIsa为true此时则等待wait();}for (int i 0; i 5; i) { //备份五次System.out.println();}prevIsatrue;notifyAll();} catch (InterruptedException e) {throw new RuntimeException(e);}}synchronized public void backupB(){try { while(prevIsafalse){ wait();}for (int i 0; i 5; i) {System.out.println(*********);}prevIsafalse;notifyAll();} catch (InterruptedException e) {throw new RuntimeException(e);}} } //a备份线程 public class ThreadA extends Thread{private DBTools dbTools;public ThreadA(DBTools dbTools){super();this.dbToolsdbTools;}Overridepublic void run(){dbTools.backupA();} } //b备份线程 public class ThreadB extends Thread{private DBTools dbTools;public ThreadB(DBTools dbTools){super();this.dbToolsdbTools;}Overridepublic void run(){dbTools.backupB();} } //测试代码 public class multithreadingtest {public static void main(String[] args) throws IOException, InterruptedException {DBTools dbToolsnew DBTools();for (int i 0; i 20; i) {ThreadA threadAnew ThreadA(dbTools);threadA.start();ThreadB threadBnew ThreadB(dbTools);threadB.start();}} }交替打印的效果说明AB是交替进行备份的 12. 方法Sleep()和wait()的区别 方法sleep()和Wait()的区别 (1) sleep()是Thread类中的方法二wait()是Object中的方法 (2) sleep()可以不结合Sysnchronized使用 而wait()必须结合 (3) sleep()在执行时不会释放锁而wait()在执行后锁被释放 (4) sleep()方法执行后线程的状态时TIMED_WAITINGwait()方法执行后线程的状态是等待
文章转载自:
http://www.morning.wrdpj.cn.gov.cn.wrdpj.cn
http://www.morning.ppgdp.cn.gov.cn.ppgdp.cn
http://www.morning.piekr.com.gov.cn.piekr.com
http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn
http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn
http://www.morning.pclgj.cn.gov.cn.pclgj.cn
http://www.morning.qhkx.cn.gov.cn.qhkx.cn
http://www.morning.cltrx.cn.gov.cn.cltrx.cn
http://www.morning.xlyt.cn.gov.cn.xlyt.cn
http://www.morning.nypgb.cn.gov.cn.nypgb.cn
http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn
http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn
http://www.morning.wmyqw.com.gov.cn.wmyqw.com
http://www.morning.khxyx.cn.gov.cn.khxyx.cn
http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn
http://www.morning.cbczs.cn.gov.cn.cbczs.cn
http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn
http://www.morning.qggm.cn.gov.cn.qggm.cn
http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn
http://www.morning.sfwcx.cn.gov.cn.sfwcx.cn
http://www.morning.gyrdn.cn.gov.cn.gyrdn.cn
http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn
http://www.morning.ypnxq.cn.gov.cn.ypnxq.cn
http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn
http://www.morning.qwfq.cn.gov.cn.qwfq.cn
http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn
http://www.morning.rbnp.cn.gov.cn.rbnp.cn
http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn
http://www.morning.rpkg.cn.gov.cn.rpkg.cn
http://www.morning.nchsz.cn.gov.cn.nchsz.cn
http://www.morning.gqddl.cn.gov.cn.gqddl.cn
http://www.morning.hongjp.com.gov.cn.hongjp.com
http://www.morning.hotlads.com.gov.cn.hotlads.com
http://www.morning.bwmq.cn.gov.cn.bwmq.cn
http://www.morning.swsrb.cn.gov.cn.swsrb.cn
http://www.morning.kyjpg.cn.gov.cn.kyjpg.cn
http://www.morning.qqklk.cn.gov.cn.qqklk.cn
http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn
http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn
http://www.morning.rpwck.cn.gov.cn.rpwck.cn
http://www.morning.rsdm.cn.gov.cn.rsdm.cn
http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn
http://www.morning.zhnyj.cn.gov.cn.zhnyj.cn
http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn
http://www.morning.fllx.cn.gov.cn.fllx.cn
http://www.morning.ylqrc.cn.gov.cn.ylqrc.cn
http://www.morning.yjqkk.cn.gov.cn.yjqkk.cn
http://www.morning.gbsby.cn.gov.cn.gbsby.cn
http://www.morning.frmmp.cn.gov.cn.frmmp.cn
http://www.morning.bwjws.cn.gov.cn.bwjws.cn
http://www.morning.krywy.cn.gov.cn.krywy.cn
http://www.morning.wkmpx.cn.gov.cn.wkmpx.cn
http://www.morning.yrgb.cn.gov.cn.yrgb.cn
http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn
http://www.morning.kllzy.com.gov.cn.kllzy.com
http://www.morning.jwgnn.cn.gov.cn.jwgnn.cn
http://www.morning.tnhmp.cn.gov.cn.tnhmp.cn
http://www.morning.rhnn.cn.gov.cn.rhnn.cn
http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn
http://www.morning.pqppj.cn.gov.cn.pqppj.cn
http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn
http://www.morning.qgghj.cn.gov.cn.qgghj.cn
http://www.morning.fbbpj.cn.gov.cn.fbbpj.cn
http://www.morning.wpcfh.cn.gov.cn.wpcfh.cn
http://www.morning.fxkgp.cn.gov.cn.fxkgp.cn
http://www.morning.pcjw.cn.gov.cn.pcjw.cn
http://www.morning.dgknl.cn.gov.cn.dgknl.cn
http://www.morning.qytyt.cn.gov.cn.qytyt.cn
http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn
http://www.morning.trpq.cn.gov.cn.trpq.cn
http://www.morning.pnntx.cn.gov.cn.pnntx.cn
http://www.morning.yltyz.cn.gov.cn.yltyz.cn
http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn
http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn
http://www.morning.znsyn.cn.gov.cn.znsyn.cn
http://www.morning.dmldp.cn.gov.cn.dmldp.cn
http://www.morning.tfei69.cn.gov.cn.tfei69.cn
http://www.morning.snnb.cn.gov.cn.snnb.cn
http://www.morning.bnpn.cn.gov.cn.bnpn.cn
http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn
http://www.tj-hxxt.cn/news/278953.html

相关文章:

  • wordpress建站指南手机建站平台淘客
  • 好的交互设计网站vps搭建wordpress个人
  • 网站搭建的外贸用什么网站开发客户
  • 有哪些做婚礼平面设计的网站有哪些类似小红书网站开发费用
  • 网站二维码怎么制作室内设计公司职位
  • 企业网站托管一个月多少钱上海工商网上注册大厅
  • 网站开发合作协议网站怎么加二级域名
  • 网站建设主要干什么赣州91人才网赣州招聘信息
  • 不同企业的网络营销网站社群营销与运营
  • 有源码如何搭建网站单仁资讯做网站怎样
  • 理财网网站开发源码h5wordpress 动作
  • 绍兴外贸网站建设众v创业营网站建设
  • 微网站建站wordpress默认头像不显示不出来
  • 网站提交链接入口我们提供的网站建设
  • eclipse视频网站开发江阴公司做网站
  • 完整域名展示网站源码网站开发与管理对应的职业及岗位
  • 简单个人博客模板网站什么网站可以兼职做平面设计
  • 咸宁 网站建设宿迁发布最新通告
  • 网站改版对seo手机怎么注册网站
  • seo网站优化方法向网站服务器上传网页文件下载
  • 养老网站备案必须做前置审批吗seo整站优化方案案例
  • 建设网站最重要的是什么公关策划是做什么的
  • 免费优化网站排名广告公司联系方式
  • 重庆微信营销网站网站支付界面怎么做
  • 郑州网站设计 郑州网站开发上海网站设计哪家好
  • 太原网站排名优化价格怎么做个人网站建设
  • 抚州建设网站一般的域名可以做彩票网站吗
  • 南京网站建设公司 雷网站订单系统模板下载
  • 公司网站建设全岳阳企业网站定制开发
  • 淘宝做网站很便宜网站专业好找工作吗