文章目录
/*
* 创建步骤如下:
* 1,定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。
* 2,创建Thread子类了的实例,即创建线程对象。本实例中是new一个ExtendThread,即可创建线程对象,也就是开启了一个线程
* 3,调用线程对象的start()方法来启动该线程。
*
* 调用示例:
* //循环10次即开启10个线程
* for (int i = 0; i < 10; i++) {
* ExtendThread extendThread = new ExtendThread();
* extendThread.start();
* }
* */
package com.zyz.mynative.demo03;
/**
* @author zyz
* @version 1.0
* @data 2023/2/15 15:51
* @Description:继承Thread类,重写run方法(不推荐,因为java的单继承局限性)
*/
public class ExtendThread extends Thread {
public static void main(String[] args) {
ExtendThread thread = new ExtendThread();
thread.start();
}
/**
* 重写Thread类的run(),这个方法称为线程执行体
*/
@Override
public void run() {
doSomething();
}
/**
* 需要处理的任务
*/
public void doSomething() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "执行" + i);
}
}
}

避免单继承的局限性,方便共享资源,推荐使用
/*
* 创建步骤如下:
* 1,定义Runnable接口的实现类,并且实现run方法,这个方法同样是线程执行体
* 2,创建Runnable实现类的实例,并以此实例对象作为Thread的target来创建Thread类,这个新创建的Thread对象才是真正的线程对象,即开启了新的线程
* 3,调用线程对象的start()方法来开启该线程
*
* 调用示例:
* //开启10个线程
* for (int i = 0; i < 10; i++) {
* Thread thread = new Thread(new RunnableImpl());
* thread.start();
* }
* */
package com.zyz.mynative.demo03;
/**
* @author zyz
* @version 1.0
* @data 2023/2/15 15:57
* @Description:
*/
public class RunnableImpl implements Runnable {
public static void main(String[] args) {
RunnableImpl runnable = new RunnableImpl();
Thread thread = new Thread(runnable);
thread.start();
/**
* 简写
* new Thread(runnable).start();
*/
}
/**
* 实现Runnable接口的run方法,这个方法称为线程执行体
* */
@Override
public void run() {
doSomething();
}
/**
* 需要处理的任务
* */
private void doSomething(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "执行" + i);
}
}
}

/*
* 创建步骤如下:
* 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类
*
* 调用示例:
* //开启10个线程
* for (int i = 0; i < 10; i++) {
* Anonymous anonymous =new Anonymous();
* anonymous.myRun();
* }
*
* */
package com.zyz.mynative.demo03;
/**
* @author zyz
* @version 1.0
* @data 2023/2/15 15:57
* @Description:
*/
public class RunnableImpl2 {
public static void main(String[] args) {
RunnableImpl2 test = new RunnableImpl2();
test.myRun();
}
public void myRun(){
new Thread(new Runnable() {
@Override
public void run() {
doSomething();
}
}).start();
}
/**
* 需要处理的任务
* */
private void doSomething(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "执行" + i);
}
}
}

/*
* 创建步骤如下:
* 1,定义实现Callable<V>接口的实现类,实现call方法,这个方法是线程执行体
* 2,创建Callable<V>实现类的实例,借助FutureTask得到线程执行的返回值
* 3,将FutureTask的实例,作为Thread的target来创建Thread类
* 4,调用start方法,开启线程
*
* 调用示例:
* Callable<String> tc = new CallableImpl();
* FutureTask<String> task = new FutureTask<>(tc);
* new Thread(task).start();
* try {
* System.out.println(task.get());
* } catch (InterruptedException | ExecutionException e) {
* e.printStackTrace();
* }
*
* 说明:
* 1.与使用Runnable相比, Callable功能更强大些
* 2.实现的call()方法相比run()方法,可以返回值
* 3.方法可以抛出异常
* 4.支持泛型的返回值
* 5.需要借助FutureTask类,比如获取返回结果
* Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
* FutureTask是Futrue接口的唯一的实现类
* FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
*
* */
package com.zyz.mynative.demo03;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @author zyz
* @version 1.0
* @data 2023/2/15 16:08
* @Description:
*/
public class CallableImpl implements Callable<String> {
public static void main(String[] args) {
Callable<String> tc = new CallableImpl();
FutureTask<String> task = new FutureTask<>(tc);
new Thread(task).start();
try {
System.out.println(task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
private int ticket = 5;
@Override
public String call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(doSomething());
}
return "出票任务完成";
}
public String doSomething() {
String result = "";
if (this.ticket > 0) {
result = "出票成功,ticket=" + this.ticket--;
} else {
result = "出票失败,ticket=" + this.ticket;
}
return result;
}
}

/*
* 创建步骤如下:
* 1,定义Runnable接口的实现类,或者定义(继承Runnable接口的类)的实现类,并且实现run方法,这个方法是线程执行体
* 2,创建一个自定义线程个数的线程池
* 3,实例化Runnable接口的实现类
* 4,将3步的实例,作为线程池实例的execute方法的command参数,开启线程
* 5,关闭线程池
*
* 调用示例:
* ExecutorService pool = Executors.newFixedThreadPool(2);
* ThreadPool threadPool = new ThreadPool("AA");
* ThreadPool threadPoo2 = new ThreadPool("BB");
* pool.execute(threadPool);
* pool.execute(threadPoo2);
* pool.shutdown();
*
* 说明:
* 示例中创建的是2个线程的线程池
* execute方法是开启线程方法,实参要求是实现Runnable的类。所以,继承Thread类的子类也可以以线程池的方式开启线程
*
* */
package com.zyz.mynative.demo03;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author zyz
* @version 1.0
* @data 2023/2/15 16:11
* @Description:
*/
public class ThreadPool implements Runnable {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(2);
ThreadPool threadPool = new ThreadPool("AA");
ThreadPool threadPoo2 = new ThreadPool("BB");
pool.execute(threadPool);
pool.execute(threadPoo2);
pool.shutdown();
}
String name;
public ThreadPool(String name) {
this.name = name;
}
@Override
public void run() {
doSomething();
}
/**
* 需要处理的任务
* */
private void doSomething() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "执行" + i + ",name=" + this.name);
}
}
}

资料参考:创建线程池的实现方法
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)