信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1775|回复: 2
打印 上一主题 下一主题

[『 Java 图文教程』] Java多线程程序设计详细解析

  [复制链接]

565

主题

649

帖子

4228

积分

积分
4228
跳转到指定楼层
宣传软件楼主
发表于 2016-10-1 09:52:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:Java 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件初级教程 

软件教程发布日期:2016-10-01

软件教程关键字:Java多线程

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述

 一、理解多线程

多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。

线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。

多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。

多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度,同步等问题,将在以后探讨。

  二、在Java中实现多线程

我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!

真是神奇!Java是如何做到这一点的?通过类!作为一个完全面向对象的语言,Java提供了类java.lang.Thread来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程,我们以后的讨论都将围绕这个类进行。

那么如何提供给 Java 我们要线程执行的代码呢?让我们来看一看 Thread 类。Thread 类最重要的方法是run(),它为Thread类的方法start()所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它!

方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:

public class MyThread extends Thread

{

int count= 1, number;

public MyThread(int num)

{

number = num;

System.out.println

("创建线程 " + number);

}

public void run() {

while(true) {

System.out.println

("线程 " + number + ":计数 " + count);

if(++count== 6) return;

}

}

public static void main(String args[])

{

for(int i = 0;

i 〈 5; i++) new MyThread(i+1).start();

}

}


这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,这时如果我们又不想建立一个新的类,应该怎么办呢?

我们不妨来探索一种新的方法:我们不创建Thread类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给 Thread 类的实例,有点类似回调函数。但是 Java 没有指针,我们只能传递一个包含这个方法的类的实例。

那么如何限制这个类必须包含这一方法呢?当然是使用接口!(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?)

Java 提供了接口 java.lang.Runnable 来支持这种方法。

方法二:实现 Runnable 接口

Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例,这一点通过Thread类的构造函数public Thread(Runnable target);来实现。下面是一个例子:

public class MyThread implements Runnable

{

int count= 1, number;

public MyThread(int num)

{

number = num;

System.out.println("创建线程 " + number);

}

public void run()

{

while(true)

{

System.out.println

("线程 " + number + ":计数 " + count);

if(++count== 6) return;

}

}

public static void main(String args[])

{

for(int i = 0; i 〈 5;

i++) new Thread(new MyThread(i+1)).start();

}

}

严格地说,创建Thread子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖 Thread 类的 run 方法,否则该线程执行的将是子类的 run 方法,而不是我们用以实现Runnable 接口的类的 run 方法,对此大家不妨试验一下。

使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。

综上所述,两种方法各有千秋,大家可以灵活运用。

下面让我们一起来研究一下多线程使用中的一些问题。


  三、线程的四种状态

1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。

2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。

3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。

4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。

  四、线程的优先级

线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。

你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。

  五、线程的同步

由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。

由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。

1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:

public synchronized void accessVal(int newVal);

synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:

synchronized(syncObject)

{

//允许访问控制的代码

}


  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

六、线程的阻塞为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持。

阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。

1. sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。

2. suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。

3. yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。

4. wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。

初看起来它们与 suspend() 和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。

上述的核心区别导致了一系列的细节上的区别。

首先,前面叙述的所有方法都隶属于 Thread 类,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。初看起来这十分不可思议,但是实际上却是很自然的,因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。

而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。

其次,前面叙述的所有方法都可在任何位置调用,但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。

同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。

wait() 和 notify() 方法的上述特性决定了它们经常和synchronized 方法或块一起使用,将它们和操作系统的进程间通信机制作一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。

它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。


关于 wait() 和 notify() 方法最后再说明两点:

第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。

第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。

谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。

以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify()方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。实际使用中我们应该灵活使用各种方法,以便更好地达到我们的目的。

  七、守护线程

守护线程是一类特殊的线程,它和普通线程的区别在于它并不是应用程序的核心部分,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。守护线程一般被用于在后台为其它线程提供服务。

可以通过调用方法 isDaemon() 来判断一个线程是否是守护线程,也可以调用方法 setDaemon() 来将一个线程设为守护线程。

  八、线程组

线程组是一个 Java 特有的概念,在 Java 中,线程组是类ThreadGroup 的对象,每个线程都隶属于唯一一个线程组,这个线程组在线程创建时指定并在线程的整个生命期内都不能更改。

你可以通过调用包含 ThreadGroup 类型参数的 Thread 类构造函数来指定线程属的线程组,若没有指定,则线程缺省地隶属于名为 system 的系统线程组。

在 Java 中,除了预建的系统线程组外,所有线程组都必须显式创建。在 Java 中,除系统线程组外的每个线程组又隶属于另一个线程组,你可以在创建线程组时指定其所隶属的线程组,若没有指定,则缺省地隶属于系统线程组。这样,所有线程组组成了一棵以系统线程组为根的树。

Java 允许我们对一个线程组中的所有线程同时进行操作,比如我们可以通过调用线程组的相应方法来设置其中所有线程的优先级,也可以启动或阻塞其中的所有线程。

Java 的线程组机制的另一个重要作用是线程安全。线程组机制允许我们通过分组来区分有不同安全特性的线程,对不同组的线程进行不同的处理,还可以通过线程组的分层结构来支持不对等安全措施的采用。

Java 的 ThreadGroup 类提供了大量的方法来方便我们对线程组树中的每一个线程组以及线程组中的每一个线程进行操作。

  九、总结

在本文中,我们讲述了 Java 多线程编程的方方面面,包括创建线程,以及对多个线程进行调度、管理。我们深刻认识到了多线程编程的复杂性,以及线程切换开销带来的多线程程序的低效性,这也促使我们认真地思考一个问题:我们是否需要多线程?何时需要多线程?

多线程的核心在于多个代码块并发执行,本质特点在于各代码块之间的代码是乱序执行的。我们的程序是否需要多线程,就是要看这是否也是它的内在特点。

假如我们的程序根本不要求多个代码块并发执行,那自然不需要使用多线程;假如我们的程序虽然要求多个代码块并发执行,但是却不要求乱序,则我们完全可以用一个循环来简单高效地实现,也不需要使用多线程;只有当它完全符合多线程的特点时,多线程机制对线程间通信和线程管理的强大支持才能有用武之地,这时使用多线程才是值得的。



untoJava 在Client/Server 中应用和实例教程next置顶吧网站信息发布发贴软件脚本
回复

使用道具 举报

565

主题

649

帖子

4228

积分

积分
4228
信息发布软件沙发
 楼主| 发表于 2016-10-1 09:53:45 | 只看该作者
实例教程3
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。
一.线程的生命周期及五种基本状态
关于Java中线程的生命周期,首先看一下下面这张较为经典的图:
Java多线程程序设计详细解析 b2b软件
上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括:
Java线程具有五中基本状态
新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

二. Java多线程的创建及启动
Java中线程的创建常见有如三种基本形式
1.继承Thread类,重写该类的run()方法。
[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 class MyThread extends Thread { 2      3     private int i = 0; 4  5     @Override 6     public void run() { 7         for (i = 0; i < 100; i++) { 8             System.out.println(Thread.currentThread().getName() + " " + i); 9         }10     }11 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 public class ThreadTest { 2  3     public static void main(String[] args) { 4         for (int i = 0; i < 100; i++) { 5             System.out.println(Thread.currentThread().getName() + " " + i); 6             if (i == 30) { 7                 Thread myThread1 = new MyThread();     // 创建一个新的线程  myThread1  此线程进入新建状态 8                 Thread myThread2 = new MyThread();     // 创建一个新的线程 myThread2 此线程进入新建状态 9                 myThread1.start();                     // 调用start()方法使得线程进入就绪状态10                 myThread2.start();                     // 调用start()方法使得线程进入就绪状态11             }12         }13     }14 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

如上所示,继承Thread类,通过重写run()方法定义了一个新的线程类MyThread,其中run()方法的方法体代表了线程需要完成的任务,称之为线程执行体。当创建此线程类对象时一个新的线程得以创建,并进入到线程新建状态。通过调用线程对象引用的start()方法,使得该线程进入到就绪状态,此时此线程并不一定会马上得以执行,这取决于CPU调度时机。
2.实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。
[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 class MyRunnable implements Runnable { 2     private int i = 0; 3  4     @Override 5     public void run() { 6         for (i = 0; i < 100; i++) { 7             System.out.println(Thread.currentThread().getName() + " " + i); 8         } 9     }10 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 public class ThreadTest { 2  3     public static void main(String[] args) { 4         for (int i = 0; i < 100; i++) { 5             System.out.println(Thread.currentThread().getName() + " " + i); 6             if (i == 30) { 7                 Runnable myRunnable = new MyRunnable(); // 创建一个Runnable实现类的对象 8                 Thread thread1 = new Thread(myRunnable); // 将myRunnable作为Thread target创建新的线程 9                 Thread thread2 = new Thread(myRunnable);10                 thread1.start(); // 调用start()方法使得线程进入就绪状态11                 thread2.start();12             }13         }14     }15 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

相信以上两种创建新线程的方式大家都很熟悉了,那么Thread和Runnable之间到底是什么关系呢?我们首先来看一下下面这个例子。
[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 public class ThreadTest { 2  3     public static void main(String[] args) { 4         for (int i = 0; i < 100; i++) { 5             System.out.println(Thread.currentThread().getName() + " " + i); 6             if (i == 30) { 7                 Runnable myRunnable = new MyRunnable(); 8                 Thread thread = new MyThread(myRunnable); 9                 thread.start();10             }11         }12     }13 }14 15 class MyRunnable implements Runnable {16     private int i = 0;17 18     @Override19     public void run() {20         System.out.println("in MyRunnable run");21         for (i = 0; i < 100; i++) {22             System.out.println(Thread.currentThread().getName() + " " + i);23         }24     }25 }26 27 class MyThread extends Thread {28 29     private int i = 0;30     31     public MyThread(Runnable runnable){32         super(runnable);33     }34 35     @Override36     public void run() {37         System.out.println("in MyThread run");38         for (i = 0; i < 100; i++) {39             System.out.println(Thread.currentThread().getName() + " " + i);40         }41     }42 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

同样的,与实现Runnable接口创建线程方式相似,不同的地方在于
1 Thread thread = new MyThread(myRunnable);
那么这种方式可以顺利创建出一个新的线程么?答案是肯定的。至于此时的线程执行体到底是MyRunnable接口中的run()方法还是MyThread类中的run()方法呢?通过输出我们知道线程执行体是MyThread类中的run()方法。其实原因很简单,因为Thread类本身也是实现了Runnable接口,而run()方法最先是在Runnable接口中定义的方法。
1 public interface Runnable {2    3     public abstract void run();4     5 }
我们看一下Thread类中对Runnable接口中run()方法的实现:
  @Override    public void run() {        if (target != null) {            target.run();        }    }
也就是说,当执行到Thread类中的run()方法时,会首先判断target是否存在,存在则执行target中的run()方法,也就是实现了Runnable接口并重写了run()方法的类中的run()方法。但是上述给到的列子中,由于多态的存在,根本就没有执行到Thread类中的run()方法,而是直接先执行了运行时类型即MyThread类中的run()方法。
3.使用Callable和Future接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。
看着好像有点复杂,直接来看一个例子就清晰了。
[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 public class ThreadTest { 2  3     public static void main(String[] args) { 4  5         Callable<Integer> myCallable = new MyCallable();    // 创建MyCallable对象 6         FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); //使用FutureTask来包装MyCallable对象 7  8         for (int i = 0; i < 100; i++) { 9             System.out.println(Thread.currentThread().getName() + " " + i);10             if (i == 30) {11                 Thread thread = new Thread(ft);   //FutureTask对象作为Thread对象的target创建新的线程12                 thread.start();                      //线程进入到就绪状态13             }14         }15 16         System.out.println("主线程for循环执行完毕..");17         18         try {19             int sum = ft.get();            //取得新创建的新线程中的call()方法返回的结果20             System.out.println("sum = " + sum);21         } catch (InterruptedException e) {22             e.printStackTrace();23         } catch (ExecutionException e) {24             e.printStackTrace();25         }26 27     }28 }29 30 31 class MyCallable implements Callable<Integer> {32     private int i = 0;33 34     // 与run()方法不同的是,call()方法具有返回值35     @Override36     public Integer call() {37         int sum = 0;38         for (; i < 100; i++) {39             System.out.println(Thread.currentThread().getName() + " " + i);40             sum += i;41         }42         return sum;43     }44 45 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]

首先,我们发现,在实现Callable接口中,此时不再是run()方法了,而是call()方法,此call()方法作为线程执行体,同时还具有返回值!在创建新的线程时,是通过FutureTask来包装MyCallable对象,同时作为了Thread对象的target。那么看下FutureTask类的定义:
1 public class FutureTask<V> implements RunnableFuture<V> {2     3     //....4     5 }
1 public interface RunnableFuture<V> extends Runnable, Future<V> {2     3     void run();4     5 }
于是,我们发现FutureTask类实际上是同时实现了Runnable和Future接口,由此才使得其具有Future和Runnable双重特性。通过Runnable特性,可以作为Thread对象的target,而Future特性,使得其可以取得新创建线程中的call()方法的返回值。
执行下此程序,我们发现sum = 4950永远都是最后输出的。而“主线程for循环执行完毕..”则很可能是在子线程循环中间输出。由CPU的线程调度机制,我们知道,“主线程for循环执行完毕..”的输出时机是没有任何问题的,那么为什么sum =4950会永远最后输出呢?
原因在于通过ft.get()方法获取子线程call()方法的返回值时,当子线程此方法还未执行完毕,ft.get()方法会一直阻塞,直到call()方法执行完毕才能取到返回值。
上述主要讲解了三种常见的线程创建方式,对于线程的启动而言,都是调用线程对象的start()方法,需要特别注意的是:不能对同一线程对象两次调用start()方法。

三. Java多线程的就绪、运行和死亡状态
就绪状态转换为运行状态:当此线程得到处理器资源;
运行状态转换为就绪状态:当此线程主动调用yield()方法或在运行过程中失去处理器资源。
运行状态转换为死亡状态:当此线程线程执行体执行完毕或发生了异常。
此处需要特别注意的是:当调用线程的yield()方法时,线程从运行状态转换为就绪状态,但接下来CPU调度就绪状态中的哪个线程具有一定的随机性,因此,可能会出现A线程调用了yield()方法后,接下来CPU仍然调度了A线程的情况。
由于实际的业务需要,常常会遇到需要在特定时机终止某一线程的运行,使其进入到死亡状态。目前最通用的做法是设置一boolean型的变量,当条件满足时,使线程执行体快速执行完毕。如:
[url=] Java多线程程序设计详细解析 b2b软件 [/url]
1 public class ThreadTest { 2  3     public static void main(String[] args) { 4  5         MyRunnable myRunnable = new MyRunnable(); 6         Thread thread = new Thread(myRunnable); 7          8         for (int i = 0; i < 100; i++) { 9             System.out.println(Thread.currentThread().getName() + " " + i);10             if (i == 30) {11                 thread.start();12             }13             if(i == 40){14                 myRunnable.stopThread();15             }16         }17     }18 }19 20 class MyRunnable implements Runnable {21 22     private boolean stop;23 24     @Override25     public void run() {26         for (int i = 0; i < 100 && !stop; i++) {27             System.out.println(Thread.currentThread().getName() + " " + i);28         }29     }30 31     public void stopThread() {32         this.stop = true;33     }34 35 }[url=] Java多线程程序设计详细解析 b2b软件 [/url]




回复 支持 反对

使用道具 举报

565

主题

649

帖子

4228

积分

积分
4228
推广工具板凳
 楼主| 发表于 2016-10-1 09:54:33 | 只看该作者
多实例教程3

最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法。
1.创建线程
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread构造函数:
  • public Thread( );
  • public Thread(Runnable target);
  • public Thread(String name);
  • public Thread(Runnable target, String name);
  • public Thread(ThreadGroup group, Runnable target);
  • public Thread(ThreadGroup group, String name);
  • public Thread(ThreadGroup group, Runnable target, String name);
  • public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
方法一:继承Thread类覆盖run方法
public class ThreadDemo1 {     public static void main(String[] args){         Demo d = new Demo();         d.start();         for(int i=0;i<60;i++){             System.out.println(Thread.currentThread().getName()+i);         }     } } class Demo extends Thread{     public void run(){         for(int i=0;i<60;i++){             System.out.println(Thread.currentThread().getName()+i);         }     } }
方法二:
public class ThreadDemo2 {    public static void main(String[] args){        Demo2 d =new Demo2();        Thread t = new Thread(d);        t.start();        for(int x=0;x<60;x++){            System.out.println(Thread.currentThread().getName()+x);        }    }}class Demo2 implements Runnable{    public void run(){        for(int x=0;x<60;x++){            System.out.println(Thread.currentThread().getName()+x);        }    }}2.线程的生命周期
与人有生老病死一样,线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法。
  • // 开始线程
  • publicvoid start( );
  • publicvoid run( );
  • // 挂起和唤醒线程
  • publicvoid resume( );     // 不建议使用
  • publicvoid suspend( );    // 不建议使用
  • publicstaticvoid sleep(long millis);
  • publicstaticvoid sleep(long millis, int nanos);
  • // 终止线程
  • publicvoid stop( );       // 不建议使用
  • publicvoid interrupt( );
  • // 得到线程状态
  • publicboolean isAlive( );
  • publicboolean isInterrupted( );
  • publicstaticboolean interrupted( );
  • // join方法
  • publicvoid join( ) throws InterruptedException;
线程在建立后并不马上执行run方法中的代码,而是处于等待状态。线程处于等待状态时,可以通过Thread类的方法来设置线程不各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。
当调用start方法后,线程开始执行run方法中的代码。线程进入运行状态。可以通过Thread类的isAlive方法来判断线程是否处于运行状态。当线程处于运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于等待状态,也可能处于停止状态。下面的代码演示了线程的创建、运行和停止三个状态之间的切换,并输出了相应的isAlive返回值。
一但线程开始执行run方法,就会一直到这个run方法执行完成这个线程才退出。但在线程执行的过程中,可以通过两个方法使线程暂时停止执行。这两个方法是suspend和sleep。在使用suspend挂起线程后,可以通过resume方法唤醒线程。而使用sleep使线程休眠后,只能在设定的时间后使线程处于就绪状态(在线程休眠结束后,线程不一定会马上执行,只是进入了就绪状态,等待着系统进行调度)。
在使用sleep方法时有两点需要注意:
1. sleep方法有两个重载形式,其中一个重载形式不仅可以设毫秒,而且还可以设纳秒(1,000,000纳秒等于1毫秒)。但大多数操作系统平台上的Java虚拟机都无法精确到纳秒,因此,如果对sleep设置了纳秒,Java虚拟机将取最接近这个值的毫秒。
2. 在使用sleep方法时必须使用throws或try{…}catch{…}。因为run方法无法使用throws,所以只能使用try{…}catch{…}。当在线程休眠的过程中,使用interrupt方法中断线程时sleep会抛出一个InterruptedException异常。sleep方法的定义如下:
  • publicstaticvoid sleep(long millis) throws InterruptedException
  • publicstaticvoid sleep(long millis, int nanos) throws InterruptedException
有三种方法可以使终止线程。
1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
3.  使用interrupt方法中断线程。
1. 使用退出标志终止线程
当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){…}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。
join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法。
3.多线程安全问题
问题原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程参与进来执行,导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不执行。
同步代码块:
public class ThreadDemo3 {    public static void main(String[] args){        Ticket t =new Ticket();        Thread t1 = new Thread(t,"窗口一");        Thread t2 = new Thread(t,"窗口二");        Thread t3 = new Thread(t,"窗口三");        Thread t4 = new Thread(t,"窗口四");        t1.start();        t2.start();        t3.start();        t4.start();    }}class Ticket implements Runnable{    private int ticket =400;    public void run(){        while(true){            synchronized (new Object()) {                try {                    Thread.sleep(1);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                if(ticket<=0)                    break;                System.out.println(Thread.currentThread().getName()+"---卖出"+ticket--);            }        }    }}
同步函数
public class ThreadDemo3 {    public static void main(String[] args){        Ticket t =new Ticket();        Thread t1 = new Thread(t,"窗口一");        Thread t2 = new Thread(t,"窗口二");        Thread t3 = new Thread(t,"窗口三");        Thread t4 = new Thread(t,"窗口四");        t1.start();        t2.start();        t3.start();        t4.start();    }}class Ticket implements Runnable{    private int ticket = 4000;    public synchronized void  saleTicket(){        if(ticket>0)            System.out.println(Thread.currentThread().getName()+"卖出了"+ticket--);    }    public void run(){        while(true){            saleTicket();        }    }}
同步函数锁是this 静态同步函数锁是class
线程间的通信
public class ThreadDemo3 {    public static void main(String[] args){        class Person{            public String name;            private String gender;            public void set(String name,String gender){                this.name =name;                this.gender =gender;            }            public void get(){                System.out.println(this.name+"...."+this.gender);            }        }        final Person p =new Person();        new Thread(new Runnable(){            public void run(){                int x=0;                while(true){                    if(x==0){                        p.set("张三", "男");                    }else{                        p.set("lili", "nv");                    }                    x=(x+1)%2;                }            }        }).start();        new Thread(new Runnable(){            public void run(){                while(true){                    p.get();                }            }        }).start();    }}/*张三....男张三....男lili....nvlili....男张三....nvlili....男*/
修改上面代码
public class ThreadDemo3 {     public static void main(String[] args){         class Person{             public String name;             private String gender;             public void set(String name,String gender){                 this.name =name;                 this.gender =gender;             }             public void get(){                 System.out.println(this.name+"...."+this.gender);             }         }         final Person p =new Person();         new Thread(new Runnable(){             public void run(){                 int x=0;                 while(true){                     synchronized (p) {                         if(x==0){                             p.set("张三", "男");                         }else{                             p.set("lili", "nv");                         }                         x=(x+1)%2;                         }                 }             }         }).start();         new Thread(new Runnable(){             public void run(){                 while(true){                     synchronized (p) {                         p.get();                     }                 }             }         }).start();     } } /* lili....nv lili....nv lili....nv lili....nv lili....nv lili....nv 张三....男 张三....男 张三....男 张三....男 */
等待唤醒机制
/* *线程等待唤醒机制 *等待和唤醒必须是同一把锁  */public class ThreadDemo3 {    private static boolean flags =false;    public static void main(String[] args){        class Person{            public String name;            private String gender;            public void set(String name,String gender){                this.name =name;                this.gender =gender;            }            public void get(){                System.out.println(this.name+"...."+this.gender);            }        }        final Person p =new Person();        new Thread(new Runnable(){            public void run(){                int x=0;                while(true){                    synchronized (p) {                        if(flags)                            try {                                p.wait();                            } catch (InterruptedException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            };                        if(x==0){                            p.set("张三", "男");                        }else{                            p.set("lili", "nv");                        }                        x=(x+1)%2;                        flags =true;                        p.notifyAll();                    }                }            }        }).start();        new Thread(new Runnable(){            public void run(){                while(true){                    synchronized (p) {                        if(!flags)                            try {                                p.wait();                            } catch (InterruptedException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            };                        p.get();                        flags =false;                        p.notifyAll();                        }                }            }        }).start();    }}
生产消费机制一
public class ThreadDemo4 {    private static boolean flags =false;    public static void main(String[] args){        class Goods{            private String name;            private int num;            public synchronized void produce(String name){                if(flags)                    try {                        wait();                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                this.name =name+"编号:"+num++;                System.out.println("生产了...."+this.name);                flags =true;                notifyAll();            }            public synchronized void consume(){                if(!flags)                    try {                        wait();                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                System.out.println("消费了******"+name);                flags =false;                notifyAll();            }        }        final Goods g =new Goods();        new Thread(new Runnable(){            public void run(){                while(true){                    g.produce("商品");                }            }        }).start();        new Thread(new Runnable(){            public void run(){                while(true){                    g.consume();                }            }        }).start();    }}
生产消费机制2
public class ThreadDemo4 {    private static boolean flags =false;    public static void main(String[] args){        class Goods{            private String name;            private int num;            public synchronized void produce(String name){                while(flags)                    try {                        wait();                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                this.name =name+"编号:"+num++;                System.out.println(Thread.currentThread().getName()+"生产了...."+this.name);                flags =true;                notifyAll();            }            public synchronized void consume(){                while(!flags)                    try {                        wait();                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                System.out.println(Thread.currentThread().getName()+"消费了******"+name);                flags =false;                notifyAll();            }        }        final Goods g =new Goods();        new Thread(new Runnable(){            public void run(){                while(true){                    g.produce("商品");                }            }        },"生产者一号").start();        new Thread(new Runnable(){            public void run(){                while(true){                    g.produce("商品");                }            }        },"生产者二号").start();        new Thread(new Runnable(){            public void run(){                while(true){                    g.consume();                }            }        },"消费者一号").start();        new Thread(new Runnable(){            public void run(){                while(true){                    g.consume();                }            }        },"消费者二号").start();    }}/*消费者二号消费了******商品编号:48049生产者一号生产了....商品编号:48050消费者一号消费了******商品编号:48050生产者一号生产了....商品编号:48051消费者二号消费了******商品编号:48051生产者二号生产了....商品编号:48052消费者二号消费了******商品编号:48052生产者一号生产了....商品编号:48053消费者一号消费了******商品编号:48053生产者一号生产了....商品编号:48054消费者二号消费了******商品编号:48054生产者二号生产了....商品编号:48055消费者二号消费了******商品编号:48055*/


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
群发软件搜巴巴分类信息网全自动发帖软件
搜巴巴分类信息网全自动发帖软件,这个分类信息网站可以免费发帖,但是网站对免费账号是有限制的。付费账号发的帖子就比较多,发的多收费自然也会比较高的,首页发帖要先绑定好手机号码,他注册如果是邮箱,就要自己去绑定一下手机号码,如果不是就不用绑定,可以手机验证码直接注册账号,分类可以在第二个访问网址动作自行更改的,没有什么大的限制,就是他这个上传图片总是会卡在那里,没在特别需要可以不传,标题内容导入就可以
群发软件精英乒乓网自动论坛发帖软件
精英乒乓网全自动论坛发帖工具,这个是一个普通的论坛,看很多人都几乎把网址给堆满了天,收录还是蛮好的,只是他注册账号是容易的,但注册成功后要手机验证码绑定一下账号才可以用,不然是发不了帖子,登陆的时候会有一个动态的验证码,只能用截图然后识别发帖,发帖还有一个动态图片验证码,需要识别成功才可以发帖成功的,基本用火眼就可以发成功就是步骤会有点多而已做好已经是三十多步的格局在里面了。这个截图发验证码的,不
群发软件杜桥东部人才普工群发
杜桥东部人才普工群发,这个网站每发一条帖子需要短信验证码,软件已经对接好网页验证码的获取平台,自己打上平台账号就可以,现在他那个 API 接口账号和密码已经更改了,要注意自己获取到来,更改后全部会变,软件这里的账号密码不是登陆账号,是他平台的 API 特有的账号密码才可以用的。这个平台发帖的,现在没有其它验证码的,还是比较方便发帖的,短信验证码其实只能用一次,因为是共享的平台,你也不知道别人用它手机号码发了
群发软件天天洁日志自动发布软件
天天洁日志自动发布软件,这个网站是自动转发采集那个绿猫网日志的,以前有这个脚本,很多人让我找这个天天洁的发布日志网址在哪里,我看了一下我用以前天天猫的网站也是可以登陆的,发布日志后,他几个小时才能同步过去,怪不得绿猫网会有这么好的收录量,原因就是因为他还有很多未知的网站转发了他发的日志,以前就很多网站为了拉自己主网站,偷偷自己弄了一些小网站转发里面的日志,而以前蜘蛛又比较天真可爱,所以就可以拉高了
群发软件京东私信群发软件
京东私信群发软件,京东对账号管得还是很严格的,可是也是一个发私信的好地方,这个脚本是通过对店铺信息采集,然后自动跳到商家地址去自动采集发信息的,所有功能都分开了,采集是按关键字进行采集的,然后逐个的自动发信息,软件能自动的切换账号,自动跳到他网站又会重新开始发帖,网站开始是没有什么大的限制,但疲举报后会被禁言,有购买记录的号会比较耐用,原理自然就是有纠纷的更加耐用了,网站账号可以导入网页的账号缓存
群发软件小红书全自动图文软件新版推荐
小红书全自动图文软件,由于小红书有所改动,特别更新一下小红书软件,小红书这个输入内容现在只能用复制文本,再贴进去,不然他会说你没有输入内容的,网站没有什么大的限制,就是发非法的东东肯定封号的事,图文一般都是比较好的流量,视频这些流量会相对质量没有那么高,都是卖货的多吧,图文这个一般是先传图片几张后,他会自动合成一种视频格式的播放模式,再加上一些文字作为段落的,网站对于发帖还是比较友好的,可以做百度
群发软件搜购网全自动发帖软件
搜购网全自动发帖软件,这个网站是 B2B 网站来的,发的人也是很多,要注意一个问题是你登陆的时候千万不要输入错误的密码,不然多次后,发帖都会有验证码,这就特别的烧钱,要是遇到这个事情也不用太担心,你只需要换一个 IP 就可以避免验证码的出现,不然就得等 48 小时再消失这个验证码的,这个得注意操作哈,网站是要付费账号才让发帖,免费号基本不让发帖,不然也会安上验证码,打码的钱算起来也够买他网 VIP 了,网站后台会有
群发软件爱卡车评论软件
爱卡车评论软件,这个网站还是爱车一派的最爱网站,发头条是可以秒收录的,不过评论还是靠刷的多,当然正规的评论也是可以上去的,虽然网站说要审核,评论最大的问题就是看上去上去了,一会又被删除的可能,网站过滤一遍,判断 IP 判断内容,判断账号频繁度,就给你安排存还是减的命运,不过量多了,总是会有很多漏网之鱼,有的人偏爱瞎看的,一条好内容往往都会带有 N 多评论,这样有利于自己主帖的排名,曝光度的呈现,都是很有
群发软件中国混凝土网站注册账号个人主页宣传页面
中国混凝土网站注册账号个人主页宣传方式,这个网站是很麻烦的 B2B 网站注册网页,不过只要完善好主页所有信息后,就可以无碍的开启主页作为宣传点,企业名作为关键字,简介作为发帖内容,是一个很不错的宣传点,注册的时候只有一个普通的字母验证码,其它几乎没有什么难度,就是步骤有点多,全部要填上才可以的,网站现在开放状态,不用换 IP,一个就可以无限的注册成功,注册成功填完所有信息后,软件可以自动的保留链接到记事本
群发软件16DS网站自动群发软件
16DS网站自动群发软件,这个网站是一种化工网站来的,可以发布商品,也可以发布帖子,一般号只能发帖子,收录还是可以的,不过一个号只能发三帖子,你要大量发帖,需要在账号列表放多一些账号去,不然是发不了太多帖子的,不知道网站 VIP 服务是多少帖子了,估计也是便宜货,毕竟全部是自己源码开发的网站,还是有价格的,软件现在设置的是发三个帖子就自动换号,要是没有号就只能发三帖子,收录概率不会很高,也会有收录,只是效
群发软件化工综合服务商网站全自动发布帖子
化工综合服务商全自动发帖软件,这个网站秒收录是比较高的,这个网站注册账号有几十项要填写的,非常试,不过也没有办法,人家的规则就是这样子,不知道是不是付费网站来的,反正登陆账号也是可以发招聘信息的,可是我看他们秒发秒收录,也不知道怎么整出来的,普通账号是每发一帖就会提示审核中,每一个帖子都要审核,可明明别人秒发就可以不用什么审核,全部都多数是秒收录上去的,收录可谓不是说不好,而是太牛了,虽然是化工网
群发软件电子工程世界论坛自动发布帖子软件
电子工程世界论坛自动发布帖子软件,这个网站注册账号会比较麻烦一些,他是先关注网站的公众号,然后公众号自动发一条短信给你手机验证码,才可以注册成功账号,注册成功的账号还要填账号密码信息,才可以注册成功,成功后还要等上五分钟,新账号才可以发帖的,不过这个论坛收录是一般的好,几乎都是秒收录的盛况。导入标题关键字到标题列表,软件会按列表从上往下自动切换着发,内容也是一样,想通过组合就放多个内容列表中去,如
群发软件领动商务网发布宣传软件
领动商务网全自动 B2B 网站群发软件,这个网站是 B2B 网站,他后台也有很多网站可以发,自己看哪一个对自己关键字收录好的才去买号发,这个网站脚本只要导入标题和内容就可以全自动发帖,没有什么难度的,什么都可以发,不过搜狗收录比较多,其它收录很差劲的,图片需要导入到图片列表,关键字可以导入标题 1 也可以导入标题 2 二个列表进行组合,内容也是一样的,多导入不同的内容有助于收录,现在都人工智能时代了,不要总是弄几
群发软件天涯生活网全自动发帖软件
天涯生活网全自动发帖软件,这个网站后台有几百个网站供选择发帖的,有的收录好, 有的收录差,看菜可以下饭的网站,给钱买一个套餐发帖卡,就可以无限的发帖了,有的网站是扣点的,就是每发一个帖子,就可以发多少帖,有的是套餐的,什么样的账号一个月可以发多少个帖子的形式,这个网站后台的文字改了,弄的后面不能通用的发帖了,他把生活必需用的关键字调用在那里,看上去当然很麻烦了,不过只做好一次就可以自动发帖了,也没
群发软件78动漫网发布宣传软件下载
78 动漫网全自动发帖软件,这个网站注册的时候需要短信验证码,注册好后就可以用账号密码登陆网站,软件是自动登陆的,导入标题内容到软件里,就可以自动发帖,发帖步骤会有点烦,要选择话题,选择分类,还要选择版块,他发帖地址全部是统一的,只有版块和话题这些是动态的,选择哪一个就可以发到哪一个版块去,软件这里是集中发到他高达的这个版块里面去的,发哪都一样,收录是比较好的,大动漫现在还有很多人喜欢追,毕竟抓人眼
群发软件混凝土网站自动B2B网站注册软件
混凝土网站自动B2B网站注册软件,这个网站是 B2B 网站后台,看上去是大站,实际全部是站群类似的,网站就是注册一个账号,然后让你输入标题,再输入公司简介,作为宣传的关键字和联系方式作为基准点的,注册的时候有一个算术验证码,软件可以自动计算出来,还有一个字母验证码,自己用火眼就可以过完,挂在那里也可以每天注册几万个账号的,然后通过收录最大取胜,后台填写也没有验证码,比较省钱的那种,不限制 IP,注册长久存活
群发软件宁美母婴论坛全自动发帖软件
宁美母婴论坛全自动发帖软件,这个网站有的人打开会很慢,有时候会很快,全看自己运气了,有的人可以发日志的,可以跑去发日志,不过论坛收录会高一些的,一般都发论坛,这个网站是不能用什么常规思维去搞的,他网站看上去是注册账号的,但注册账号并不能发帖成功,发邮件这些也是收不到的,直接用 QQ 号登陆,点一下 QQ 号登陆,然后把缓存放到软件里才是最优的方法,也可以用微信搜码登陆,微信搜码登陆只能保留缓存一天,QQ 号
群发软件揭阳招聘网站自动发普工信息软件
揭阳招聘网站自动发普工信息软件,这个网站是免费发广告的网站,他都是需要短信验证码解码后才可以发送,这种网站不用注册账号,只需要付出几个短信验证码就可以完美的发帖成功,收录还很牛的样子哦,只是现在短信平台总是改来改去的,就有点麻烦,但做好一次就可以疯狂发送也是很值当的,网站是网页发帖的形式,自己导入好关键字作为标题,这个是输入姓名和工作名称里去的,内容就是直接输入简介里的,为了方便收录,这个每一个号
群发软件第一枪B2B网站自动发布宣传软件
第一枪B2B网站全自动发送帖子软件,这个是 B2B 网站后台,比较复杂,不过你要是用缓存写入他的登陆方式就简单太多了,这个是通用脚本,按客户的思路定制的,先是用缓存登陆网站,然后打开产品和资讯的发送网页,输入标题,清空内容,为什么他网站要有一部清空呢,原因是网站他自动会给你上一段内部的内容例子,你还必须去清空,不然他就会在你输入内容的后头里呆着,手工发的时候你感觉不到,因为一点,会自动消失,软件点不行,只
群发软件脉脉专栏网站自动群发工具下载地址
脉脉专栏自动发帖软件,脉脉这些大网站都基本有头条专栏的,而且都只能发正规的内容,他一般都需要审核的,账号也比较难搞到,发的人不多,可收录会比别的都好,他们都限制发多少,所以这个脚本都做了发帖切换账号的功能,发多少就切换一次账号,这样正规的内容一般都可以无限的循环发帖,加上现在智能人工写文章,其实收录会很吓人的,内容这里是图文并茂在一起的,图片上传了两张,是用 POST 上传的,看不到过程,调用是图片变量
群发软件小站教育全自动注册发提问软件
小站教育全自动注册发提问软件,这个网站一个手机号码一个验证码,只能注册一个号,成本比较大,但效果也是蛮好的,注册有一个字母验证码,一个短信验证码,软件全自动完成,注册的时候用户名不能超过 10 个字,软件用户名是调用标题 1 提问的时候是调用总标题总内容的,注册成功后,软件会自动去发一条提问,因为你到时收录的是个人主页,有一条提问,就有了联系方式,有了联系方式就在了关键字,有了关键字就有了内容,这些都是
群发软件弈城围棋论坛全自动发帖工具
弈城围棋论坛全自动发帖工具,这个网站是学棋的,现在素质教育成了很多人消费的场所,有人气的地方就有江湖,所以收录都不会差到哪去,他们往往就是百度蜘蛛看热闹的地方,哪怕是论坛有几个人对骂吵架,都成了它爱去的场所,带来了吃瓜群众的心情。这个论坛发帖没有验证码,注册一个简单的验证码,注册成功就可以发帖,没有啥限制,因为是论坛来的,所以发帖数量可能会被有限制,软件可以设置多少帖就换一个账号的。其它不用设置什
群发软件奇幻世界社区发帖软件
奇幻世界社区发帖软件,这个是繁体网站只是一个游戏论坛,估计是台湾省那边的主题网站,游戏不知道有没有人玩,看收录还是可以的,注册账号有一个验证码,看的不是很清楚,不过随便输入就可以注册成功,网站写的比较差劲,但还是可以有收录的,自创论坛就是这个模样的多,这些字体也比较难看得出来,好在猜也可以猜出点意思,发帖自然也能发出去的。这个软件写了登陆步骤,可以自己换号,发帖成功,也有采集成功网址到记事本里,自
群发软件OAWXW复印机维修论坛全自动发帖软件
OAWXW复印机维修论坛全自动发帖软件,这个网站是类坛来的,需要用微信关注他的公众号,才可以进行发帖,注册成功网站账号后,还要手机验证码一次,才可以发帖,这个脚本是用缓存 CK 进行登陆的,采集的时候只能用两个参数,不然网站采集回来的缓存是最后对不上发帖的那二个验证码的,一个是算术的,一个是汉字的验证码,这种汉字验证码只能用火眼去打码,不然失败率高,自动的识别率不高,当然现在人工智能还是可以的,就是还蛮贵
群发软件易次元网站自动刷帖子软件
易次元网站自动发布帖子软件,这个网站现在还是很多人跑去玩的,所以收录肯定都是秒收录的,像网易的网站,大多数都是各种各样的验证码,各种各样的邮箱验证的,看上去安全策略够高了,可在人工智能打击下,他的验证码都已成摆放了,这个网站发帖可以秒收录的,但新号可能要审核一次验证码,登陆是用缓存的,没有买到 CK 号就只能自己先把号全部登陆一次,软件可以点击采集缓存按钮,就可以全部缓存到碗里去的。发帖内容只能用键盘
群发软件汽车之家头条号自动发帖软件
汽车之家头条号自动发帖软件,这个网站登陆有验证码,所以脚本写成了用缓存登陆,这样切换账号,就可以方便一些,每天也不用自己手工登陆,蛮方便的操作了,网站标题需要模拟键盘输入的方法,而内容需要用粘帖的方法进行操作,不然标题会没有输入成功,内容也会没有格式,他的这个内容图片会比较特别,需要用他网站的一种 IMG 标签,不然你粘进去的图片也会只有源码,但是用他网站格式的图片,就会很顺利的发成功,封面图片也能自
群发软件vk网站自动创建社区自动发帖软件
vk网站自动创建社区自动发帖软件,以前 VK 网站一直不给登陆账号了,现在又有人弄了一种超级缓存账号来登陆创建社区,然后自动发帖,这个脚本也是这样,最后还可以采集出来帖子网址扔蜘蛛池,完美的操作,这种号发多了也没有验证码,不知道他们在哪弄的,不过只要有缓存就可以用这个脚本,自动的登陆自动的发帖,你用这个脚本只需要导入标题内容和账号就可以,注意,账号是缓存形式,你要是几个号的,没有缓存,就自己登陆一下,点
群发软件临时工网站自动发帖手机版软件
临时工全自动群发软件,这个网站是一种手机网页来的,倒计时会比较多,你不点击他一些比如姓名,工作地区的选择,不点它是不加载的,加载要一点点时间,对于这个脚本来说,很多动作都需要加点倒计时,不然运行太快会导致发不成功的,不是说没有选择这个,就是那个,他这个介绍,更是弹窗的方式才可以输入的,其它还好,不过网站要手机验证码的,软件全部流程做好了,只要自己弄好短信平台账号到软件里面就可以全自动的运行下去,网
群发软件学习使我快乐自动注册软件
学习使我快乐自动注册软件,这个网站听起来会不会比较鸡血,不过人家就好这口,你也无能为力,网站注册很简单,用软件自带的邮箱账号就可以无限的注册,收到激活码一填就完成任务了,网站可以标题填写成昵称,介绍可以做成内容,这些都可以无限的注册,也不封 IP,没有什么限制,有蜘蛛池的大家们,可以工作优化对待这个网站的,网站收录还可以的,个人中心页收录了也很多,有先见之明,全部都不错的存在了,注册成功保留了网址,
群发软件分析百科网站网自动注册个人主页群发软件
分析百科网站网站自动注册个人主页宣传方式,这个网站是注册账号的,本来先前还可以发日志的,网站数据库的姓名没有改,所以发不了帖子了,密码对应不上,存不了数据的 BUG ,所有内容都不可以输入,但是标题可以,所有标题不超过二十个字,都能让网站存档的,这个是网站的 BUG,没有办法解决,解决这个网站也不存在了吧,注册账号有字母验证码,要短信才可以注册成功,宣传主页,只能填个人中心的标题,带上联系方式和关键字,收
群发软件ACFUN网站自动发布文章软件
ACFUN网站自动发布文章软件,这个网站本来是有一定的机率是可以成为 BIBI 那样的收录量的,但他们已经自废武功了,变得很严格几乎发什么都封号,所以发这个网站要有 N 多号用才行,这个脚本软件是发他专栏的,虽然上传视频的多,但也管得严格,这个专栏也不是每天可以发,管得严格的时候,就不让发,只是发爽文或是一些分类可以发的,其它分类有交通管制,导入账号和密码就可以登陆,一般不出拖动验证码,网站要业绩的时候就松,不
群发软件绿猫网日志发布软件
绿猫网日志发布软件,这个网站以前是一直都有做过的,只是很多人都说发不了了,其实他只是登陆不了账号,但注册账号还可以用的,注册后自动可以登陆,所以把注册写在这里吧,注册很简单,访问网址,用软件自动注册一个就可以一直发帖,每天如此,这个网站日志程序可以说是超级高人写的了吧,占用资源超级少,能沿用至今,可以说是牛人的感觉了,网站发帖有一个验证码,发帖的网址也可以保留下来,没有啥限制,全部帖子可以发,注册
群发软件象山招聘网全自动发帖工具下载
象山招聘网全自动发帖软件, 这个网站是短信验证码方式进行发帖的,现在发的人比较少,因为他先前可是改过名字的人,很多人如果不看他的 LOGO 会找不到他短信验证码的项目数字,这种网站一改码,就可能接收不到短信了,所以按他的 LOGO 名字为准,当然最好的方式是自己手机接收一条,按他发来的短信名字作为项目搜索关键字是最准确的,很多网站找不到项目也是因为网站换了一个名称导至后台找不到短信验证码关键字。网站不用注册账
群发软件老客网站自动发帖软件
老客网站自动发布帖子,这个网站以前是分类信息中的大佬,特别是房产类的信息,更是最多霸屏的存在,可惜现在没有人买房了,他也就没落了哈,不过最近看到他异类信息收录超级好,不知道怎么整的,全部是用缓存发帖的,就是登陆一个账号,因为他有验证码,所以都用缓存切换账号着发,他注册一个账号,采集着一个缓存,这样可以弄 N 多号,N 多帖子的存在了,发帖倒是要审核的,房产分类信息最多收录,其它收录不怎么好,挂羊头卖狗
群发软件易车网全自动发帖软件
易车网全自动头条群发软件,这个网站是发易车头条的公众号,因登陆常常有验证码,所以改成了用缓存自动登陆的状态,无非就是手工登陆一次,用软件保留好缓存就可以了,功能已经做上去了,省去了不少的事,这样就可以每天不用折腾登陆,自动导入标题和内容,还有图片,批量的发帖子,省时省力,完全可以不用去管理什么的,他网站发帖的时候,需要具专一张竖版图,还要上传一张框架图片,这才可以发帖成功,无法是用软件自动操作多几
群发软件印刷报价网自动注册发布个人主页软件
印刷报价网自动注册发布个人主页软件,这个网站他可以批量的注册账号,可以填写标题和联系方式进行生成式网址,网址都是用户名的方式,但如果想中文网址的话可以不超过十个字,他会自动转码,网站注册的网址比较隐蔽,一般不细心可能找不到,他有重写页面,开始我还以为是 B2B 网站,可他网站都把注册的网页给删了,是后面加了一个注册表单页才注册成功,但不影响公司网址的激活的,他注册成功会自动登陆上账号,不用自己再次登陆
群发软件百度百家号姓名修改软件
百度百家号姓名修改软件,百家号和百度个性签名号是不同的,很多人以为是改个人中心里面的,但其实不一样的,他只显示在百家号里面的名称,百度个人中心那边是不会变化的,不过他也是要审核后才可以放出来,只是有一些能人实在是太有头脑了,他们都会改一个比较诱人的名字,然后用软件自动的发一些科技类文章就行了,没有什么审核的门槛在那里,全部都几乎可以通过的,这相当于免费给您带来流量的广告了,也许网络无聊的人太多了吧
群发软件运云港便民网全自动发提问软件
运云港便民网全自动发提问软件,这个网站是本地信息网站来的,有点像门户网站,网站用手机验证码注册账号,一般都可以注册成功,发帖也有一个字母的验证码,其它没有什么限制,不过网站有时候可以发,有时候又不可以发帖,全凭他心情,没有什么规律,网站收录还是蛮好的存在,不过有时候他网站还会跑去初始化,所有以前的帖子都会被吞噬掉的,不讲什么历史痕迹,收录下来的,自然也会被百度蜘蛛给激活删除机制,发一帖网址也可以可
群发软件中国商之桥网站发布宣传软件
中国商之桥网站全自动注册发企业页面软件,这个网站可以无限注册,并且收录极好,但都是好在有蜘蛛百度才有这样的功劳,网站一路注册下来,没有验证码,没有限制 IP,可以无限的注册,是一块宣传的风水宝地呀,虽然主页看起来的,但不影响收录和看自己注册好的个人主页,这类网站,寄托在他们网站本身强大的流量,触发收录机制。不过偶尔也有注册不成功的时候,就是点注册,就返回首页了,但不影响什么,注册不成功,我们软件会自
群发软件搜猪论坛全自动发帖软件
搜猪论坛全自动发帖软件,这个网站是真的搜猪的网站,他是二级目录进行抬高,标准的 SEO 网站了,网站可以短信登陆,也可以账号密码登陆,不过注册账号还是要要用短信注册的,要是不注册成功,会一直提示账号错误,或是验证码错误,实际是账号没有云注册一下所以才会出现这猪扒手。网站登陆成功就可以一直发帖,几乎没有啥限制,一个号可以无限的发帖,发帖成功的帖子是可以被收录的,但这些二级目录的网站,说实在的,秒收录的几
群发软件ACFUN网站自动注册账号软件
ACFUN网站自动注册账号软件,这个网站是通过注册一个账号,把姓名作为关键字带联系方式,个性签名共可以输入 225 个字符,作为宣传内容,这个不能多的,多了会提示失败,标题也不能超过 10 个字,不然也会提示不成功,他是一种用短信验证码注册的方式,有时候注册的时候会弹出拖动验证码,这个拖动验证码会比较变态,对了也提示错,错了也会提示错,不过登陆的验证码可以注册拖动成功的,登陆成功后,才可以进去个性签名里修改有采
群发软件大圣培训学校网站发帖提问自动群发软件
济南市历下区大圣培训学校网站自动发帖软件下载地址,这个网站是可以免费发提问的,不过注册账号的时候是手机短信验证码的,比较麻烦一些,注册成功的号马上可以发帖,似乎网站发满了广告,虽然收录很多,毕竟有很多人把关键字新鲜感给先走了,您后期能不能收录就大打折扣了,现在百度收录规则就是一个网站有新鲜关键字,会优先收录,但您后面发同类的关键字,就极难收录了,可不像以前的那些网站了,其实我们只要把当天秒收录文章
群发软件21iC电子技术论坛全自动发帖软件
21iC电子技术论坛全自动发帖软件,这个网站是一个论坛,看样子人气还这么高,也算是没有谁了,可能技术对于网络来说还是那么吃香吧。网站发帖全部都是秒收录的,不过注册账号还是比较麻烦的,需要关注他的公众号,发一个手机号码给公众号,然后才会收到验证码,验证码一般要发二次手机号,才能注册成功,网站设定是这样,不然是没有办法注册成功账号的,也算是比较麻烦的一个点,看在收录秒的份上,还是快到锅里去吧,网站发问题和
群发软件足下国聘优职网站小组群发软件
足下国聘优职网站小组群发软件,这个网站是很久以前的小组了,服务器还是一如既往的差劲,注册倒是很快完成,没有任何验证码,倒是这个鬼发帖有点悲剧,极度的卡成猪。账号没有加入小组是发不了帖子的,很多人总是针对这种网站无缘无故的发帖页面而感到头痛,因为他们不知道点了加入小组才会出现发帖按钮的操作。这个脚本还是做一次加入小组动作的,新手太多了,这个发帖还是会出验证码的,用火眼成功率会高一些,用图鉴会成功率很
群发软件合肥家政网站自动发帖软件
合肥家政网站自动发帖软件,这个网站是一种网络论坛后台提问题的网站,他也是一种小小的社区网站,只要随便注册一个账号就可以一直发帖,网站他发帖的时候,只要一个分类和标题内容就可以发成功,发成功不会即时显示发帖成功的网址,需要点击一下标题,才能显示,这样才可以把当前的网址采集回来才行,由于网站没有啥限制,一个号就可以一直发帖子,切换列表,导入内容就行了,没有什么大的局限性的,自己多段组合,自己弄好蜘蛛池
群发软件刷痕迹网站软件
刷痕迹网站软件,开刷三个特别有效果的网站,一个是世界经理人,您要是用他的搜索文章,他会给您生成很多关键字相关的链接,并且会在网站热门关键字的几千页后面,给您上一个独立的页面,非常有效果的一个网站,现在有网站敢这样留下痕迹的,已经不多久,相当于您在这个网站发了帖子,还给您一个免费的链接作为报酬,您说别人做不做,要是有自己的蜘蛛池作为外链群发点,更是厉害的要命了,还有一个爱采购的链接生成,不过这个是有
群发软件法圣网自动发帖子软件
法圣网自动发帖子软件,这个网站发帖子收录不高,但个人中心而却收录的 N 高,不知道怎么回事,可能是快照没有更新的原因吧,也可能是网站把关键字给蛛蛛池弄错了,不过收录还是秒的,这类网站也不知道怎么的,反而这些出了错的标题,收录特别好,可能是某类 BUG ,而且这类网站,总是过不了多长时间,就会暴发一次,所以很多人追着这类网站狂建,有几个做的不好,又卡又丑的反而排名特别的高,也不知道原因是什么,这个网站只要注
群发软件强琴吧社区全自动发帖软件
强琴吧社区全自动发帖软件,这个网站只是一个论坛的形式,但也比较多改版的地方,注册是拖动验证码加手机验证码才可以注册成功,他注册成功,要去收藏一下琴谱和头像,这样才可以发帖,网站每天七点多才可以发帖,明显是有人管理的地方,不过收录超级好,几乎一发当天就有收录,不过账号损耗有点大的,发链接外链,或是发一些特别的关键字才能够本,这个软件先是做一次账号的全采集,有短信验证码平台就可以办到的,然后是用设置缓
群发软件人机对抗智能社区自动发帖软件
人机对抗智能社区自动发帖软件,这个网站是一个社区可以发帖的地方,注册账号比较麻烦,有十多个选项要填上去才可以注册成功,后面有一个手机验证码,要收到四位才可以注册成功的,注册成功账号放到软件列表,软件会自动帮您登陆好账号的,这个只是一个很简单的社区论坛,但收录是很不错的,访问版块网址,软件会点击发帖按钮,他网站不是弹出新的网页进行输入标题和内容的,而是弹出浮动的窗口,这样快很多,就是定位比较难一些,
群发软件SCUM中文社区自动发帖软件
SCUM中文社区自动发帖软件,这个网站是用一种authorization 进行写入缓存发帖的,采集这个authorization:保存到列表也可以,直接用微信搜码登陆也可以的,感觉全部都没有办法长久保存他的缓存,就只好用微信搜码进行登陆了,登陆后就可以一直发帖子现在,发的时候倒是没有验证码,发帖也比较自由,只要把标题导入到软件的标题 1 列表,内容导入到内容 1 列表就可以自动发帖,如果想组合,就对标题 123 这三个列表进行分割导入,内
群发软件中小B2B网站注册软件
中小B2B网站注册软件,这个网站您操作下来一次会有点怀疑自己眼睛,明明输入是对的,但网页却没有显示,明明提交成功的,但网站不提示成功,让您会不会很焦虑呢,其实他网站注册页面改动了,而以前的源码又没有注释掉,隐藏起来了,又导致输入的时候,输入到了老源码里,这样就会造成看不到结果了,不过全程用座标输入地名和密码,就可以好了,提交的时候也用座标点击,反正只有一个简单的验证码,注册完提交资料后,他是一种好的
群发软件外链开刷软件蜘蛛池网址集合
外链开刷软件,这类织梦后台留言最近变的极度火爆,秒收录高,可以免费一直刷网址和一些关键字,反正很多都会被收录,不知道百度放开了什么,只要放进去网址,可以达到收录的效果,也可以放进去关键字和联系方式,也可以达到秒收录的结果,只是量要大,这种就是一种堆积关键字,提高曝光率的地方,说什么成功的经验完全没有,只有这些收录好的网址进行表现,重复这些操作留言就可以,能发多少就发多少,完全免费,没有什么大的限制
群发软件龙穆商企网自动注册自动发帖软件
龙穆商企网自动注册发企业主页软件,这个网站是 B2B 注册页面的,注册很简单,但企业完善信息倒是非常复杂,有几十步之多,而且注册是有验证码,提交企业完善信息也是需要验证码的,步聚上是没有什么问题,用软件写好了,只是这个验证码就有悲剧了,弄了半天,输入验证码也不会提示成功,最后用了这一段代码,才验证成功:// 直接设置ccaptcha span的内容为验证成功document.getElementById('ccaptcha').innerHTML = '  
群发软件犀流堂小组群发
犀流堂小组群发火眼识别过程,这个网站最麻烦的就是发帖这个验证码,其它还好,可以随便用手机注册一个账号一直可以自动发帖的,没有什么难度,只是这种验证码,差那么一丁点都不行的,都会判断错误,更可狠的现在没有一个好的拖动验证码平台对这种验证码进行拉动,只能靠不准确的座标进行定位,效率自然差很多的。效率是不高的,但收录是完美的,发一帖赚一帖了,成本有点高,用的是火眼识别平台,好像只能 POST 提交可以高一些,
群发软件CSDN文章发布软件全自动发帖软件
CSDN文章发布软件全自动发帖软件,这个曾经的百度蜘蛛王者,有点难于归于平静,可惜他找不到自己的往日辉煌了,情况他可能不知道,因为失去了秒收录的命,为什么秒收录的过程会消失,很有可能是自己作的,很多平台就是这样,自己以为上了三十六般刑具后,自己就可以高忱无忧了,天天看看剧等下班的事儿,可惜的事,他们把洗澡水和孩子一起丢出去了,正所谓,民可载,也可以覆船,他们这些脑白金是想不通的,倒回厉史后再看,原来自
群发软件微信视频号全自动发帖软件
微信视频号全自动发帖软件,微信不要以为只能在 APP 上发帖哈,其实也可以在网页里搜码登陆账号,采集好软件账号的缓存,再用软件的上传功能,短短几步就可以一直上传视频发送了,和抖音那个上传一样,可以无限的发送,只要你弄的有价值的视频,就可以一直发着帖子,没有什么大的限制的。不过他上传的地方超级多要填的,这个脚本只是上传视频,切换视频,上传输入标题和简介,然后提交到后台就可以了,没有什么多余的操作,什么定
群发软件狮城论坛全自动群发软件
狮城论坛全自动群发软件,这处网站秒收录超级高,不过是有人管理的哈,论坛分类广告倒是发广告的地方,发家教的人比较多,网站注册一个号就可以发帖,无法自动注册账号,他注册的时候有腾讯的验证码,还有谷歌的验证码,可谓武装到了牙齿的存在了吧,好在发帖倒是比较简单的,注册一个账号就可以发帖,没有其它限制,发帖的时候是很简单的,图片要导入到软件的列表中,不然发不了帖子,网站要求每一个帖子都要一张图片的,不然是发
群发软件前途招聘网全自动发普工软件
前途招聘网全自动发普工软件,这个网站和其它网站不同,他是有白名单机制的,只对一些 IP 可以发的,要是不在芤范围内的,会一直提示当天发帖已满的提示,具体能不能发得自己去试一下,要是不行的只能联系他们网站的人看看人家是不是收费的梗去做的帖子的了。虽然软件不用账号也没有任何验证码,但他一个地区限制可以拦截了很多地方的疯狂发送了。发帖成功后,需要采集回来帖子链接的,要注意加上标记,不加上是采帖不回来帖子的,
群发软件Mamamia人才网自动发帖普工网站软件
Mamamia人才网自动发帖普工网站软件,这个网站是不用什么大的限制的,发的人也多,不用注册账号,不用手机短信验证码,只有一个普通的字母验证码就可以疯狂发送,现在是没有半丁点限制的,发帖速度也快捷,只是采集帖子的时候一定要把标记加对,不然是无法采集回来正确的网址的,如果不需要采集网址的就不用理这个标记的事,内容可以重复,但标题最好不要重复,发的时候需要多开几个脚本,这样发帖收录机率是更高一些的,软件自动
群发软件绿猫网全自动发日志软件
绿猫网全自动发日志软件,这个网站整的还是很有格调的,但是注册的账号登陆不了是一种怪事,只能注册一个号发一个号,他是注册好了后自动登陆上去的,也不用导入账号了,就直接写注册了,全程自动,注册好网站会自动登陆好账号,没有验证码,没有限制,发日志可以一直发,后面要是说什么限制的可以注册一个发一个帖子也可以,反正啥限制也没用,成功发帖网址也有采集动作,自己选一个地方保存起来就可以,发帖的时候有一个字母的验
群发软件临时工网普工全自动软件
临时工网普工全自动群发软件,这个网站不用登陆账号,不用输入验证码,手机百度收录的很好,网页 PC 端比较一般,这个临时工网现在发帖是有短信验证码,这个脚本已经全程跑通了的,用的是猪猪的接码平台,发一帖就要接一次码,看上去效果还不错,发的人比较多,想采集到自己的帖子,需要自己放上自己帖子标题的关键点,这样才可以采集回来帖子,不然全部采集回来是有可能的哈,不要去注册账号登陆发,不然会发不了几帖的,只要短信
群发软件博联教育网推广软件
博联教育网全自动发帖软件,现在这些提问网站是 AI 最多访问量的网站,也不【知】道是人活在这个世界总是提问还是因为啥,收录超级的好,这个网站注册是免费的,也没有啥验证码就可以注册成功,一个号可以一直发,提问的时候有一个五位数验证码,算是比较简单的操作了,提问问题的时候,必须让他弹出新页面,不然他就一直卡在那也是一件麻烦事,他网站提交的时候必须弹出新页面,才可以提交成功,比较麻烦的点。提交后采集问题也会
群发软件驻马店人才网普工全自动发帖软件
驻马店人才网普工全自动发帖软件,这个网站没有手机验证码的,只有一个数字验证码,发起帖来也秒成功,不过他不显示帖子网址,也采集不到,只是看到他网站页数链接在增加,完全看不到帖子在哪里,我试了在手机端可以找到,但网页端是完全打不开帖子的,发这个网站也只能边发边让网站自己自动收录了,没有办法抓取到帖子网址的链接的,不过看到还是有很多人会自动被收录的,不【知】道他们是怎么操作的哈。 驻马店人才网自动发帖软
群发软件东门网论坛全自动发帖软件
东门网论坛全自动发帖软件,这个是论坛来的,网站注册账号需要邮箱去激活账号,注册成功后,还需要等 15 分钟后才可以发帖,不过注册一个账号后,只有一个验证码,就是填写网站域名的问答,其它没有什么限制,这个脚本也加了采集成功网址和切换账号功能,暂时不【知】道他一个号可以发多少个帖子,不过收录还是蛮好的,到处都有收录好的帖子,也可以发超链接,如果内容有图片,还会自动到首页去,这个是他网站调用帖了机制,到了首
群发软件益起映创小组自动发帖软件
益起映创小组群发网站自动发帖软件,这个网站是小组来的,您注册账号的时候要准备手机验证码,注册成功后,就可以疯狂的发帖,像这些卖课程的网站,现在是如雨后的春笋一样多,主要是这些老师不是这个专业的,随便拉一群私域的人就可以开干了,他们弄完了暑假就会沉默好一阵子才会出来干活,而中间就是发广告的有利时期,一堆的人都会跑去发广告,收录也是很有效果的,因为他们有的网站私域超多人呆在上面吸取学习资料的,所以 人

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2024-9-28 02:15 , Processed in 0.202183 second(s), 48 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表