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

 找回密码
 立即注册
搜索
查看: 1633|回复: 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*/


回复 支持 反对

使用道具 举报

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

本版积分规则

相关导读
群发软件53货源网全自动群发工具
53货源网全自动群发工具,会员登陆后就可以发帖,这个网站是发布货源的网站,相当于一些工厂货源发布的网站,厂家是比较多人来这里发的,网站也比较新鲜,不像是一些 B2B 网站照样直接就拿来用的网站,真的,有的网站本来是很有机会的,可是他们非不愿意自我放开,导致扣扣爽爽的,结果就让很多货源的人不【知】道去哪里发,换句话说,有的人有资源找不到发的地方,有的人有资源,却不【知】道哪里找到客户发,这就有点悲了,本来
群发软件华中贸易网全自动群发软件
华中贸易网全自动群发软件,这个网站是 B2B 网站,现在这类网站对于上传图片 POST 这块会有比较大的区别,有的是要自定义后缀,有的是要对应后缀,比如是 PNG 或是 jpg 的都可以,这个网站五大分类都可以发,像供应,资讯这些会收录比较好,软件对于这个 POST 会比较友好,但调试是很麻烦的,有时候多一个空格也不行的,网站对于数据流处理是很严格,或是说他们容易很低,不管收录有好有差的一边,这类网站有时候收录极好,有时候
群发软件168信息网自动发帖软件
168信息网自动发帖软件,这个网站是 B2B 网站,和以前做的都不同,它是一个新人开发的平台,收录比其它的都好,可见作者是不是打的批量版,而是打精品战略的人,有的人喜欢搞大军团作战,有的人喜欢搞尖刀式作战,各有各的优点,看自己能力圈在哪里就往哪里发展才是最优选择吧,如果有能力那肯定是尖刀式的省钱,但没有,那就只能做批量创造收录的概率呢,就像成功的事常做一样,只需要把量打上去,一样可以达到那种效果的,所有的
群发软件云推送网站网站自动发布帖子软件
云推送网站自动发帖软件,这种网站也是 B2B 改版过来的,不过他看上去会比较新鲜一些,毕境很多功能像是以前的那些搜了网的功能,这种平台发帖多,收录主要是靠提交给百度蜘蛛池的,如果没有自己的池子,是很难被百度这老人家强行收录的,网站比较简单,但可以刷新信息,和这个发资讯的脚本一起上传,听说刷新收录快,不【知】道是不是真的哈,软件自动登陆账号,自动发帖,导入标题内容,要和网站开 VIP 会员,不然是发不了帖子的
群发软件站站网全自动群发软件
站站网全自动群发软件,这个软件是 B2B 网站,现在这类网站发的人越来越多,反正有这样的市场,那些单个的网站反而没有什么好戏码,这类网站批量生成的,有好的会留下,收录不好的,自然就会被换一个域名,换一个网站空间重新去做,然后留下就会越来越好了,软件只要导入标题内容,导入账号就可以全自动发帖,如果用软件自动发帖,就可以省了很多手工操作,比如他能一年挂机不用操作心,只要自己准备好账号密码和标题内容就可以全
群发软件投聂网全自动B2B发布帖子工具
投聂网全自动B2B发布帖子工具,这个网站是 B2B 网站来的,自己可以自主充值,这些 B2B 网站可能没有秒收录,但月收录还是有的,他们打的都是一个批量生产,相当于边发边收录,还是边发,您说终竟的最终收录,他们是肯定没有咯,而这些理论上存在的例子也不是那么好的呈现在上面,这个网站也分为 PC 端一个,POST 后台版一个,都做了一个脚本吧,免得有的人喜欢爱好都不同,也能闭出一个不会的理由出来,有了这两个版本就不同,他们
信息发布软件旅法师营地创作平台自动发布帖子软件
旅法师营地创作平台自动发布帖子软件,这个网站发帖的步骤会很多,做完后要三十多步,他要选图片,又要上传封面图片,确定选择版块这些,整的头都痛的节奏,现在还有哪一个平台这么复杂的哈,网站是手机验证码登陆的,自己要注册一堆账号,他每一个号只能发一帖,这种这么偏避的平台,还是没有什么人抢着注册的,随便找一个 API 就可以注册一堆的号,网站游戏论坛,收录不会差到哪去的,就是步骤比较繁琐,只要做好一次,倒计时足
群发软件五洲商务网全自动发布帖子软件
五洲商务网全自动发布帖子软件,这个网站是 B2B 网站,继续弄两个版本吧,一个是 POST 的,一个是普通的版本,对于搜狗来说,这些网站效果还是很好的,很多人傻白甜分不出什么是什么吧,所以一直有人在用,不过这些现在都不重要了吧,百度自己也没有什么大的更新,感觉有点修修补补,几乎要放弃了,可是规则上加码,完全不管收录了,这个网站,只要有号就可以发,所有什么供应,采购,行情,这些信息都会自动切换着发,从头部切换
群发软件CSDN网站自动发注册账号软件
CSDN网站自动发注册账号软件,这个软件是利用短信验证码,大批量的注册 CSDN 网站的账号的,注册的时候发现居然没有验证码,以前这个网站是丢外链的圣地,现在倒是管的严格,收录也没有以前那么好了,发现他注册账号完全不用验证码了,这倒是一件值得看的好事,只要收一个短信码,就可以顺利注册成功,不过初始账号还是比较多的,需要输入新的用户名,点确定就可以注册成功,它网站注册成功会跳到主页去,然后软件判断主页代码,进
群发软件gitee网站注册账号软件
gitee网站注册账号软件,这个网站有一个拖动验证码,有一个字母验证码,以前是做过的,现在换一个短信平台,就可以直接注册成功,并且把缓存给采集到列表备用,这个网站收录是几乎无敌的状态,所以账号是肯定值钱的,您如果有什么外链,可以丢到这个网站进行跑蜘蛛,这个网站有点像以前的 CSDN 网站,CSDN 以前是超多漏洞的,不【知】道以前发过的人有没有记过,发外链几乎秒收录,可是他自己太作做了,非要改变,导致收录不同往日
群发软件秀购网全自动发布帖子软件
秀购网全自动发布帖子软件,这是一个 B2B 网站,只是做了一个 POST 脚本,一个普通网页的脚本,他们的限制是比较少的,网站个人中心也可以联系 QQ 充值,这些可不是我们软件的平台,他们找的网站都有这些,软件中您想节省电脑资源的,可以用 POST 版本,想看过程的就用 PC 普通的版本,两个有好也有差的一方面,但收录都是一样的,图片放到软件的列表中去,他能自动的传上网站去的,但图片后缀只能用 JPG,其它格式不能上传上去,
群发软件武法出租车论坛全自动发布帖子软件
武法出租车论坛全自动发布帖子软件,这个论坛版块是比较多的,而且是一种动态验证码,它是一种典型的养网站例子了,不过您要是没有买到内部账号,发帖是比较费劲的,因为一个号只能发两个帖子,软件先是自动的写入网页缓存账号,写入缓存是只能有两个论坛发帖参数的,如果不然,您一会发帖的验证码,他永远提示您是错误的,针对这些有登陆验和发帖验证码的,都必须按这个脚本这样写入缓存才可以。这个可以作为动态验证码论坛例子,
群发软件导列网全自动群发软件
导列网全自动群发软件,这是一个 B2B 网站,做一个普通网页版的群发软件,做一个后台 POST 提交的软件,软件没有太多折腾的地方,全部都是自动操作的,导入标题内容就可以全自动发帖子,图片一定要有 JPG 后缀的,不然会在 POST 脚本上传不了图片,内容的图片可以加在内容 2 或是内容 3 里,这样发出去带 IMG 的标签,就会显示到内容图片里,您发帖的时候,在内容框里上传一次,内容会自动的带在图片里面穿插进去,弄二个脚本,一
群发软件快手图文自动发布软件
快手图文自动发布软件,图文发布实际就是传一张图片,然后加上标题和内容,和上传视频一样,他都是一样的操作,只是内容不能超过一千字,不然会发不出去的,手机 APP 上也会有这样的限制,视频对于这个网站来说发的比较多,图文虽然流量很大,但却是没有多少人有耐心看完所有的文章的,都几乎往视频流里里折腾,图文这个可不是靠什么百度收录的,他们就像 BIBI 网站这些一样,全靠自身的超大 IP 流量进行粘帖用户,相当于一个大的
群发软件百家号头条全自动群发软件
百家号头条发送软件,这个头条是自备文章导入发送的,之所以新瓶装旧酒是因为这个是有技巧的发送,他是利用一个 HTML 编辑平台的转换代码,让自己可以在百家号发送头条号不被删除除,文章估计都是用通过小炎号类似的人工智能创作平台进行攒写的,所以都比较容易不被删除的,而且很容易被百度收录,现在几乎没有人会通过自己手打出来,软件先是 HTML 平台把代码给转换一下,再用软件的复制全赞功能,把内容给写进了粘帖板,写入缓存
群发软件知乎个人主页自动设置软件
知乎个人主页自动设置软件,用缓存去写入【知】乎个人主页名称,他是 180 天才能改一次的名称,还有他里面的个性签名,他的职业介绍,都成了百度蜘蛛超级爱好的地方,只是注册一个号只能改一次,这着实有点浪费 RMB 了,不过效果是好的很的,第一来,也极少会被封号,就算号被封了,他的个人主页还在那,名称也不会变,致少还一直在那,二来还是要找到手机好的平台,才可以这样玩,价格不贵,脚本这个是廷续昨天的那个,这个是设置
群发软件知乎自动注册软件脚本下载地址
知乎自动注册软件,这个网站管的是比较严格的,而且验证码也是比较恶心的那种,但对接飞码这个平台还是可以注册不少的账号,如果这个平台没有号码了,也可以更换到其它平台的 API 里,软件并不限制您对接哪一个 API 接口的,只要有随便可以改的,像什么俄罗斯或是其它国家的号码都是可以收到的,只要短信一接,就可以登陆,有的平台限制多,有的平台限制极少的,这个脚本主要是提供注册,〖逻辑〗判断是比较多的,各种判断有没有登
群发软件搜客商务网全自动发帖软件
搜客商务网全自动发布帖子软件,这个网站也是 B2B 网站,做两个版本供后续使用,网站传图片一定要注意,这个脚本默认是 JPG 的,如果需要改成其它格式,他网站是不能自动识别的,需要改脚本上传动作,只要把上传动作改成对应的后缀格式就可以,但没有经验的最好不要去动吧,JPG 图片用的比较多,就用这个就可以了,也没有什么很卷的操作吧,各种各样的格式,如果不是为了美化什么的,没有多大的必要,网站每发一帖就要付一角钱的节
群发软件商务导航网全自动发布软件
商务导航网全自动发布软件,这个网站也是 B2B 网站,只做分类信息发布,现在的目标是把所有这些 B2B 网站进行大切换,做一个 POST 版本,一个 PC 普通的版本,像昨天的那个网站,居然玩的是手机收录的接口,而这个倒是中规中矩的网站,只要有 VIP 都发帖就可以了,没有太多的限制,不是 VIP 也不给发帖,全部是走会员路线的,网站只要有点收录,就有一大群人往里面堆量的,现在 B2B 网站都成了这个常态,然后收录又会慢慢下滑,然
群发软件发财草网站自动发帖软件
发财草网站全自动发布软件,这个网站倒是蛮新的,他有点像分类 58 同城网的模块,现在倒是落了一个清静的网站,专攻什么手机 APP 里去了,越来越麻烦的地方,这个网站还是B2B后台类似的,能不能收录,完全看发的数量,发的多了,收录自然就好了,如果发的少就很难说了,免费发的时候还会有一个验证码比较麻烦的,网站只能发一个地方,就是资讯的版块,也不用做太多〖逻辑〗判断了,软件还是做了两个脚本,一个是 POST,一个是普通
群发软件爱搜群网站自动发布软件
爱搜群网站自动发布软件,这个也是 B2B 网站,网站现在免费发帖都有验证码,每天有十帖的免费,都是集人气的一种措施,不过免费的发的这么少自然效果不会好到哪去,这个要了解哈,毕竟水桶的容易是按他的短板计算的,可不是什么随随便便可以改变的事,这个脚本分二个脚本,一个是后台运行,但您必须开好会员,不然肯定发不成功的,这可不是 POST 就可以自动的跨越他的限制,就直接可以发了,这是不可能的,除非人家允许这样免费哈
群发软件银盾皇全自动发帖软件
银盾皇全自动发帖软件,这里两个版本,一个是 POST 版本,一个是普通版本的,很多人非要弄两个版本去发一个网站,有时候需要快,有时候需要看到过程,所以很多 B2B 网站改成了两个版本,网站发帖是比较简单的,有账号就可以发,他们 B2B 网站本来就是用来发广告的,他们充好会员就可以一直发帖,网站是一种计件方式的,每发一帖就扣多少钱,网站越好,收费就越贵一些,便宜的网站也有人发,那些家伙也有的是图心里安慰的,也不【知
群发软件跑列网全自动发布软件
跑列网全自动发布软件,这个是 B2B 网站来的,只要导入好标题和内容,放好会员号就可以全自动发帖,这个是后台发送的版本,和普通的版本,只要有号就可以全自动发,两个版本放在上面了,看电脑吃饭,第一个就用的是普通版本,他能看到过程,一个是 POST 过程,他全程后台运行,可以多线程,发的会比较快,几乎不占电脑资源,后台静默运行,针对差劲的电脑设计的,不过您看不到过程有时候会心慌慌,人就是对没有掌控感的东西会产生
群发软件小木虫论坛自动软件
小木虫论坛自动发布帖子软件,这个脚本是手机版的,所以还是有必要发布一下的,网站每年这几个月,会超多人用,所以到处找这个软件的人也比较多,而 PC 不管是用的 POST 还是啥,都容易被封号,但是这个 WAP 端应该是老掉牙的地方,所以防火墙会有一个漏洞的,这个网站主要是内部号发的比较多,也就是他们自己的号,小号发还是有机率会被封的,最好有能力的还是拿到内部号,这个端的会发的比较快,可以自己发一些版块,导入比较多
群发软件鲁德软件平台提问软件
鲁德软件平台提问软件,这个网站是一种软件平台来的,软件在这个网站的提问版块进行提问,因为是提问的,一般一个账号就可以发很多,不过他是有一个极验证码的,软件这个脚本用的是图鉴平台进行打码,识别还是很便宜的,直接可以拖动对,没有用 POST 的那个极验证码平台,感觉他们现在已经差不多了,时代在进步,人工智能找这些图片座标还是像爸爸打三岁小孩似的,随便下手。不过这个网站和的是缓存登陆哦,第一次发,您可要自己登
群发软件爱搜网全自动群发工具
爱搜网全自动群发软件 POST 版,这个网站只有两个分类,一个是产品供应分类,一个是资讯分类,产品供应分类的系数是 25 这个可能网站自己也没有关注到问题所在,一般是 21 系数收录才会好,好在资讯这个默认了,对于收录,这些网站都已经被百度蜘蛛给训化了,人家都会按惯性的方式去爬行,如果您想另起一门旗帷,那就只能说抱歉了,您还没有那个实力与之抗争,还不要说,人家现在技术性的业务是比较少的,您想让他改变那种爬行方式
信息发布软件POST 中巴网全自动群发软件
POST 中巴网全自动群发软件,这个是 B2B 网站,不过以前都是做的普通版本,这个是 POST 版本,可以节省电脑很多资源,可以不占用后台,可以后台静默运行,可以飞快的跳过一些错误,可以秒完成发帖过程,自动后台传图片,然后采集图片地址,进行采集保留,再判断里面有哪一些分类,再把分类随机切换,这个标题可以加长的模式,内容也是不被限制的发帖模式,因为是后台运行,他这些限制的都是页面 JS 限制的,不过您要不是网站会员,
群发软件乐扫网 B2B 网站全自动发送软件
乐扫网 B2B 网站全自动发送软件,这个网站也是 B2B 网站来的,有的人总是在迷茫中生活着,总是说找不到网站发,那您就可以弄几个这样的 B2B 网站先把池水动起来呀,为什么一直在纠结那些秒收不秒收的事呢,很多网站前期是沉默的,某天东风将至,收录直接就飞速上升了,这些网站现在都有这种特点,不过他们也不【知】道,现在有很多论坛更是牛,收录比这些快的多,可不是什么 DZ 论坛,而是一些主题论坛,也是这样,某几天收录超级
群发软件记得网 B2B 网站全自动群发软件
记得网 B2B 网站全自动群发软件,这个网站也是 B2B 网站分类来的,他对搜狗收录会比较好,不过谷歌居然也有很高的收录,不【知】道他是走的啥运气了,百度收录差一些了,现在几乎很少人玩这些,不过有收录就有流量肯定的,国内国外都有,网站现在已经做了这种 B2B 网站模板了,全部过程只需要改一个地方,那就是网址列表的网址,您换了网站,只要把域名放进去,全部就会自动的,不管您想发供应,还是产品,还是行情这些分类,软件
群发软件尚格论坛自动发布帖子软件
尚格论坛自动发帖软件,这个只是普通的论坛,但因为先前是地方论坛来的,人气还可以的,收录也不会差到哪去,论坛是用户名登陆的,他一个页面有手机登陆,这个可不是通用的登陆接口,普通登陆是登陆不上的,只能用户名登陆的接口才可以,注册账号的时候要注意,不是手机号码登陆的,注册是手机号码,但是用户名才有效果的,发帖的时候没有验证码,一个账号可以无限的发送。只是发帖时间要十秒以上,不然他可是会出验证码给您按排上
群发软件驴在陌自动发提问文章软件
驴在陌自动发提问软件,这个网站是发旅行日记和路线的,不过日记这里肯定收录的比较好一些的。只是他登陆的地方只能用微信搜码登陆,短信验证码登陆,收录后还是要跑百度蜘蛛池的,不然基本不会有收录量的,发帖还有一个字母的验证码,您还必须写上,不然是不给发帖的,网站间隔时间是三十秒一帖,如果要快就只能加多几个号同时开脚本去发的。内容这里需要用座标的输入方法去整,不然是没有用的,因为他不让源码输入,也不用逐字输
群发软件Apipost网站自动发博客软件
Apipost 网站自动博客发帖软件,这个网站登陆是有一个点触验证码的,不过对软件来说这种验证码已经是最简章的存在了,所以加一个座标点击,就完事了,网站也没有太高的要求,不过发那个博客是五分钟只能发一帖,不然会一直显示发帖太过于频繁,会发不出去的,五分钟一帖,是很折磨的,但软件不会嫌烦,他能自动的切换账号发,可以自动用的缓存登陆发,可以自动动的等分钟发的,完全看您想要方还是圆的,一切都可以调试,没有什么限
群发软件灭提问网自动发提问软件
灭提问网自动发提问软件,这个网站后台会不会有眯怪,不管这么多了,软件可是用来发广告用的,这个网站登录有验证码,发帖也有一个字母的验证码在上面的,所以是要耗钱的,不过这些网站这两年如果找到好的,都是秒收录的存在,比百度自己的产品收录都要好,这是非常神奇的地方,特别是这些提问类的网站,更是牛的不行,边发边秒收,只是每天要发,有一天不发,那收录就全部回到了解放前了,原因可没有人【知】道的事,规律就是这样
群发软件齐鲁信息网站自动发布工具
齐鲁信息网站自动发布工具,这个网站只是一个站群论坛来的,他网站会自动大量地用软件挂 N 多信息,等收录好了就卖账号给别人发布帖子的方式,论坛是比较难做收录的,但一旦能做起来,收录会更好一些,排名也会高,论坛本来就是冲着交流的属性去的,所以百度蛛蜘收录的方式排名也是不一样的,虽然经过了这么多久,但基础框架摆在那里是不可能太多的转变,网站就一个简单的问题验证码,回答对了就可以登陆和发帖,他网站也会有大量
群发软件微软Sway自动生成软件
微软Sway自动生成软件下载, 对于国内来说可能不是很神奇,但在谷歌里可能早已经是大佬级别的存在吧,外国人的东西有很多是很新鲜的玩意儿,但用的人却像是比较高级的,而国内的东西,有一点新鲜的东西就会扎堆在那里玩弄,也不【知】道是价值观的问题,还是因为人的大脑都喜欢没有见过的新鲜玩意儿,这个东东可以生成很多漂亮的新闻稿,像 PPT 类似的。不过外国人这些看上去很多都已经被人工智能给完美替代的主了吧。软件这里是写
群发软件百度文档自动上传 WORD 文件软件
百度文档自动上传 WORD 文件软件,这个网站应该是比较多人弄的,不过弄的都是正规的方式,以前可以弄成审核通过了,放一些外链网址去,可是现在审核通过修改,又要审核了,基本让他堵住了漏洞,不过还是有一些人在上传 WORD 用的,毕竟正规工作的人太多太多需求了,这些文档收录好,还可以赚钱,很多人会贪那点方便下载别人集合好的文档是行调用,特别是一些总结,一些目录,都是别人幸苦劳作的结果,甚至有的是作为小说的宣传地把
群发软件企业录网站分类信息软件
企业录网站分类信息发布软件,这类网站有十年多的历史了吧,还是老网站好,随便发一发就收录,问题是养起这些大胖小子也是不容易的,先前的坚持与无奈,以前可能会觉得是一只吞金兽,现在可是一棵摇钱树了吧,还理啥财,种一棵树最好的时机是十年前,其次是现在,我们努力的规划好了吗,现在人工智能发帖也是这样,找一个 AI 的形象,把自己训练出来,也许可以永生哦,有很多人都是这样想的,把自己所有的思想存到 AI 里,算出来一
群发软件师徒网自动发布提问软件
师徒网自动发布提问软件,这个网站有点像博客,不过他又分出了一个提问版区,所以这里收录会比较好一些,他这个提问区其实是 WP 博客系统弄的,也不【知】道为什么整出这么一个版块出来,他登陆方式,全部都已经美化了,但 WP 博客系统那种选择分类的模型至今没有什么变化,还是老三样,这里发布帖子的时候,他分类是用了固定的方式的,登陆有一个点触验证码,估计是比较简单的鼠标检验,用座标功能点击一下就可以实现自动登陆了。
群发软件大河网B2B软件
大河网全自动群发软件,这个网站是 B2B 网站来的,本来就给您发广告用的,不过他只有发资讯类的,要充多少钱他是可以自动开通的,也算是很方便的一个自助网站了,这类权重比较小的网站,网站主人也是很聪明的,他们会把所有信息发到一个分类,这样可以提高一个分类目标的权重,收录自然会比散弹枪好很多的,只是网站也没有啥快的,很卡屏的感觉吧。不过他这个鬼下拉分类倒是很奇葩,天天会更换,不【知】道要整点啥,所以我这里是
群发软件天天基金头条发布软件
天天基金头条发布软件,天天基金这个可是史上最多有钱人的集散地,网站以前其实是他博客的一个升级版,不过现在头条看上去大气上档次一些吧,也没有太多的限制,只是一个账号一天只能发五帖,首次登陆会有一个点触验证码,不过第二天就会没有,网站是可以缓存登陆的,要是封号了就很完蛋,内容要关于财富之类的内容,不然是会被秒删除的,软件现在是用账号密码登陆,第一次登陆您得手工去输入验证码才让登陆成功,账号密码可以自动
群发软件建设工程网软件群发
建设工程网软件群发,这个网站看上去也是同一批人产品,这类 B2B 网站,如果能收录的,都会出大牛股,如果不能的,那就只能做一个低调的的老百姓了,百度蜘蛛也是一样的得性,看到这类网站开始的时候疯狂追逐,等发现网站内容太过于相似的时候,他又心生讨厌了,只好时不时的远离了,某一天还来给您玩一个空然消失的游戏,让您猜个饱,您是这里生病了,还是那里得病了呢,不过找原因都是徒劳,所有问题都其实出在一个新玩意儿的身
群发软件中国结艺网自动 B2B 网站群发软件
中国结艺网自动 B2B 网站群发软件,这个网站是发布广告的网站,只要有号就可以发,没有验证码,没有审核,有内容和标题都可以导入进去发,其实现在 GPT 这类生成文章,发起来效果会好一些,自己的内容,再加上生成的内容进行发上去,会比插入新闻和小说内容会好一些,只是很多后【知】后觉的人不【知】道怎么生成去用罢了。 结艺网自动 B2B 网站软件下载地址: 随着互联网的普及和电子商务的兴起,B2B(Busin
群发软件当当AdSmart 自动上架货物软件
当当AdSmart 自动上架货物软件, AdSmart依托全球最大中文书店&网上商城当当网,帮助客户进行最有效的市场推广。面向白领,公务员及您可自由选择广告发布类型和目标页面,并可随时修改广告内容和预算。这个软件可以自动批量的上架一些自己的物货,自己只需要输入书本的系列号到软件中去,然后软件会自动按书名,关键字排序,把货物自动把图片,和系列号自动上架上去的一种程序化操作,账号这个分类也是需要自己添加一下的,就是想
群发软件36商务网发布帖子软件
36商务网B2B网站软件,这个网站自然也是 B2B 分类商务网来的,网站是做搜狗搜索的,所以对于这个比较友好一些,只是他们都是 PC 端的,虽然搜狗能秒收,可百度收录也没有多好的效果的,这些网站现在主要是打一个堆量的效果,发的多,收录自然也会上去,发的少的话,自然没有什么好的收录量,不管您发的这种类型网站是大网站或是小网站,没有量一定就是扯皮,没有效果的。只要把量堆下去了,百度蜘蛛多么正人君子,最好也会看在多的
群发软件哔哩哔哩网站专栏群发软件
哔哩哔哩网站自动上传内容图片发布专栏软件,这个网站就是账号比较难求得,一直以来他网站都这种开放模式,收录是现在全网巨好的一份子,现在几乎没有这么开放的网站,有这么高收录量的老大哥,这个脚本可以上传四张图片,其实就是重复的把那几步上传步骤修改一下就可以的,然后分别采集存放到了软件的四个列表,方便插入到内容里,他调用图片必须有一个代码,不然是无法显示图片的,这层里是最麻烦的地方吧,不过专栏不用上传视频
群发软件电梯阁论坛群发工具帖子软件
电梯阁网站全自动发帖子软件下载,电梯阁论坛全自动发帖软件,这个网站看上去会很普通,不过只是一个论坛,但是他是一种技术性论坛,所以秒收录是极高的,特别是他放广告的版块,收录还是比较喜人的,都很多秒收录,看来很多人还是很在乎这些技术性的分享的,虽然现在不正常的人还玩着电脑,正常的人可能早就飞上了哪一个高枝了吧,网站还是这么奇葩的样子,版块多,广告多,收录也居然还被百度蜘蛛给爱上了哈。 电梯阁论坛群发工
群发软件搜狸网站自动发帖软件
搜狸网站自动发帖软件,这个网站是一种注册账号模式发帖的,他和B2B网站类似,但网站没有这么容易即时放开审核。显示中的都是自动审核过的,网站收录的也是搜狗的作用,不过网站是付费形式的,他有会员后台,登陆也会有一个验证码,发帖就一张图片,一个分类,一个标题内容就可以自动发帖成功,没有什么难度的,不过内容这个输入框是嵌套的方式,也就是只能针对他一个网站会有作用,换一个网站这步就得重新做了,好在网站发帖也没
群发软件微页B2B网站发帖软件
微页B2B网站发帖软件,软件市场营销和信息发布时,微页B2B网站发帖软件无疑是一款备受推崇的辅助工具。该软件专为在微页B2B平台进行信息发布与推广而设计,其独特之处在于发帖权限主要面向付费用户开放。这一特性使得微页B2B网站得以有效筛选并确保平台上企业的资质及信息的真实性,从而维护了一个相对纯净且高效率的商业信息发布环境。 微页B2B网站发帖软件下载地址: 发帖过程录像: 微页B2B网站发帖软件作为一项
群发软件图图网文章自动投稿软件
图图网文章自动投稿软件,这个看上去像是一个相册网站,但他其实是一种投稿的网站来的,账号也是付费才会通过审核,并不是免费让您我限发的,网站肯定有点水份才会让您付费,一般这类付费发帖的网站,都可以实现免自己提交蜘蛛池的效果,至于收录结果,完全是看您自己的标题内容的质量说话的,再加上网站的权重高,那收录可能超好,要是没有达到蜘蛛池的要求,那收录就像打水漂似的差劲的,发这类网站,最好的方式是自己复制当天秒
群发软件喜马拉雅自动评论软件
喜马拉雅自动评论软件,这个网站可以发听歌单的,不【知】道为什么大家都不动合,不过今天刚好有人要弄一个评论,他说收录更秒吓人,他是先采集最新的听单,然后采集多少页,再进行听单逐个评论,由于是最新的听单,所以评论都几乎在第一页呈现,如果提交给百度蜘蛛池,很快就秒收录了,这些网站PV非常高,几乎是人气最大的地方,他们拥有的宝藏是值得开发的,如果你的号是VIP号,评论几乎是秒出来,他是利用听单的评论收录,所以
群发软件亿图脑图账号注册个人主页中心页宣传方案
亿图脑图账号注册个人主页中心页宣传方案,这个网站是注册账号进行主页宣传的,这个网站是AI脑图生成的,非常聚人气,所以收录一直很好,他个性签名可以输入标题和内容,内容是二百个字,超过了就输入不了,提交不成功,最好是自己算好字数导入,特别是有一些特殊符号的,这种网站是要跑蜘蛛池的,不跑基本很难收录,不过一旦收录,会一直存在上面,很划算的,排名也很高,不过这个网站也有一个毛病,他要在个人主页里点注册,如果
群发软件17173社区发帖软件
17173社区发帖软件,游戏社区一直是秒收录的地方,像这些大IP超级最多人玩的PV地,肯定都是秒收录的高级地区,这个脚本是自动在剑侠社区发帖的,社区可以自己更换,也可以自己选择分类,不过现在收录最好的就是这么几个社区地了,虽然他是三级域名,但17173的名头还在的,社区里最多人的地方,就是在这里了,社区很多人流的地方,不过这个一个账号发帖会有限制,软件是利用缓存CK进行写入的,没有做登陆步骤,因为他登陆有验证码,
信息发布软件知识辰星网站动态群发软件
知识辰星网站动态群发软件,这个网站和以前的动态微博类似的网站,他是没有太大的区别的,不过他网站一会放开注册发帖,一会又限制,让人摸不着头脑,网站放开的时候就像是洪水一样带来N多的收录,发帖多的人自然知道怎么弄内容可以收录,以不弄弄某些内容不会收录的,如果不明白这点,是极度百万剧的存在,因为你根本就没有吸取前面的经验,只是有盲目从众的干活,是得不出好的结果的,做很多事情既要低头拉车,也要抬头看路,知
群发软件720云网站自动创建场景软件
720云网站自动创建场景软件,这个网站是做全景VR影像类似的,发现他们居然可以把这个链接做为宣传的地方,不过只能五十个字完工,也就是标题这里输入五十个字左右,脚本里做了限制五十个字,太长会被K掉,用的是他的素材库,网站没有什么太大的限制,封号也是看运气的,只是网站不能用缓存登陆,他那个验证码是会动来动云的,传到网站打码会有一点差别的,基本是手工打码一个号就可以一直发,没有什么限制,素材用啥都可以,网站权
群发软件QQ 音乐歌单全自动群发软件
QQ 音乐歌单是一个比较低成本的宣传方式,软件先是通过 QQ 登陆歌单页面,然后往了老面的发标题和简介进行宣传,音乐视频小说站可以说是最容易收录的地方了,比其它的限制还少,现在主力位往往很少关注这些,这也是给广告提供了位置的空缺地带,这个脚本可以采集缓存,然后写入缓存进行账号切换着发,这样是很简单的操作了,有的收录了,连评论都成了权重地,因为这些跑跑蜘蛛池极容易变成一个收录地带圈,这也是因为 腾讯这些默认
群发软件晋江小说网站书单软件
晋江小说网站书单软件,最近看书的书单很火暴收录,因为他们书单可以任意的发,可以让他网站小说的PV直接升级收录,一般来说他们PV高的网站都是秒收录的存在,只是他们没有太多的外在链接,全部是靠自身的小说网站进行的,只不过这些网站比较难找到,特别是这个网站,他的书单是在很多很多公告最底下的,不认真看居然不【知】道他的存在,居然他存在就会有一个好的收录量了,只要找到书单的网址,然后提交书单,都可以有一个好的收
群发软件洋溪信息港自动发布软件
洋溪信息港自动提问软件,这个网站有点像论坛,但他其实手机网址里发提问才有收录,其它收录比较差劲,而且这个已经很久了,以前一直不让发的,最近又恢复了可以发帖,故此做一个脚本进行发提问,发成功后可以直接采集网址,自然收录也可以,丢蜘蛛池也是可以的,网站效果还是很别具风格的,就是账号都是手机验证码注册,好在他网站提问账号可以疯狂刷,没有验证码发帖,只要放进去账号密码,软件就可以自动登陆,自动的发帖,没有
群发软件百度贴吧视频上传软件
百度贴吧视频上传软件,百度贴吧消费了这么多年,仍然是最大的社区,也算是难得了吧,他的规则时严时松,给做广告的人都有了一定的空间,这个网站虽然严格,全部都是机器人审核的,但也因为这样才有操作的空间,有的时候某些BUG是层出不穷的,有时候是同音字的天下,有时候是视频上传的天下,有时候是图片动态的天下,各有千秋,好不热闹的样子,这个脚本是自动上传视频的,只要号是正常都可以上传成功,主要是没有验证码,省一笔R
信息发布软件Moloney网站自动发帖软件
moloney网站软件,这个网站只能发提问的一个后台,因为网站是品牌比较在的网站,可能架构是有问题的,不过网站发帖一个号可以发很多帖子,帖子发完要在个人中心才能把帖采集回来,发的很快也无所谓,网站不理这些事,提问这个发成功他是按里面分类进行帖子排列的,你发哪一个分类就要专进哪一个版块去采集个人帖子网址,这样丢蜘蛛池才会有效果,百度自然收录这些网站基本是不能的,因为网站权重比较低的,只能靠外力去抓取,上星
群发软件三一办公网站自动注册账号宣传主页软件
三一办公网站自动注册账号宣传主页软件,这个网站都是下载PPT的一个网站,这些网站收录量都极大,随随便便一个就有几百万的收录量,也不【知】道他们好在哪,可能现在做老师的还会在这些网站下载资料吧,他们也不得不弄这些PPT上课玩,生活所迫,都有不容易的,下载这些PPT也是乘着以前的流量做大做强了许多,现在可能都在用手机在做PPT了吧,不过聪明点老师们可能还在用传统的电脑在做这些PPT,不然他们以前买的电脑不也是成了废
群发软件面圈网站自动发帖工具
面圈网站发提问软件,这个网站是一个综合性网站,但似乎可以发提问作为广告,以前不可以注册账号,最近又恢复了可以注册了,注册需要手机验证码才可以发,他发帖也没有多少限制,基本就是登陆一个号,就可以一直发提问,不过内容输入框有点麻烦,软件这里是用点击一下,复制所有列表要发的内容,然后粘帖进去的,完美的解决,不过这样也有点问题就是会占用打字的粘帖板哈,这样就只能独立让他运行了,不然会窜行的,发帖的时候还要
群发软件腾讯兔小巢软件
腾讯兔小巢自动创建产品软件,这个创建产品有点像微信里的小程序,他是一个小组讨论类似的,这个网站账号也是比较多人买的,都是微信搜码登陆,然后自动登陆上的意思,不管是发帖,还是创建产品都会有一个腾讯的验证码,现在随着人工智能的来到,这些验证码几乎就是小菜一碟了,没有啥难度,三下五除二就可以破解好,并且可以给您建一个强大的识别库了,现在打码平台也很多看到了这种机遇,只要跑一跑几天,就可以把一个识别库给整
群发软件17推论坛专用发帖软件
17推论坛是一个站长论的网站,以前很火的,现在也还是让别人发一发软文,发一发外链作为网站的赚钱点了,很多不愿意去尝试新的东西的网站都还守着这一亩三分地,当然在不断变化的时候,这也没有什么所谓对与错,只是他们选择是这样,没有了那种多大心去办多大的事,只有剩下这点能量,再去发火挥自己应该有的光和能罢了,有时候坚持自己能车范围的事,比说什么大道理还要有用,出击着各种各样的新市场,守着自己的成功之作,发光也
群发软件西瓜视频软件
西瓜创作平台视频自动上传软件,这个网站其实是抖音的子公司,也是借助他的力量做大的,但西瓜视频他主要着重点是网页的东东,不过也因为太多太杂的原因,他网站收录的就比较快,视频网站别的不了解,但收录是最好的,没有之一,现在他改版成只能上传视频,输入标题,上传封面图片,我们可以弄关键字,然后把视频封面上下功夫,其它是不让填写的,没有简介的了,以前是有的,现在已经全部改版了,软件是可以发一帖切换一个账号,切
群发软件汕头大学论坛自动群发工具
这些个论坛是精简单的,不过人家做的久一些,所以有一定的流量,以前这些论坛是满大街的到处都是,还整了各种各样的验证码,现在简单了,只要您有号就给发帖,可以说是白送的,因为这些论坛想活下去,就必须卖点账号,必须拼一拼到最后一口气,直到没有了,才会消失,很多以前很多人的社区都是想赚最后一个铜板,都想来赚赚钱,然后再关闭,服务器什么时候到期都不会再去续费玩了,不过最后收录还是很好的,以前您可能都没有发现自

QQ|( 京ICP备09078825号 )

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

GMT+8, 2024-5-1 18:06 , Processed in 0.184064 second(s), 50 queries .

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

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