ES6之 async 函数

ES6之 async 函数_第1张图片
picture

1、含义


ES2017标准中引入了async函数,使得一步操作变得更加方便。
那么async函数是什么?一句话,它就是Generator函数的语法糖。
有一个Generator函数如下,依次读取两个文件。

const fs = require('fs');

const readFile = function(fileName) {
    return new Promise(function(resolve, reject) {
        fs.readFile(fileName, function(error, data) {
            if (error) return reject(error);
            resolve(data);
        });
    });
};

const gen = function() {
    const f1 = yield readFile('/etc/fstab');
    const f2 = yield readFile('/etc/shells');
    console.log(f1.toString);
    console.log(f2.toString);
}

上面 代码的函数gen可以写成async函数,就是下面 这样。

const asyncReadFile = async function() {
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString);
  console.log(f2.toString);
};

一比较就会发现,async函数就是将Generator函数的(*)替换成async,将yield替换成await,仅此而已。async函数对Generator函数的改进,体现在以下四点。

  • (1)内置执行器
    Generator函数的执行必须依靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行。
  • (2)更好的语义
    asyncawait,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
  • (3)更广的适应性
    co模块约定,yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以是Promise对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即resolvedPromise对象)。
  • (4)返回之是Promise
    async函数的返回值是Promise对象,这比Generator函数的返回值Iterator对象方便多了。你可以用then方法指定下一步的操作。
    进一步说,async函数完全可以看作多个异步操作,包装成的一个Promise对象,而async命令就是内部then命令的语法糖。

2、基本用法


使用async的函数会返回一个Promise对象,可以使用then方法添加回掉函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体后面的语句。
下面 是一个例子 。

async function getStockPriceByName(name) {
  const symbol = await getStockSymbol(name);
  const stockPrice = await getStockPrice(symbol);
}

getStockPriceByName('good').then(result => {
  console.log(result);
});

上面 代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象。

下面 是另一个例子 。

function timeout(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

上面 代码指定50毫秒后,输出hello world

由于async函数返回的是Promise对象,可以作为await命令的参数。所以,上面 的例子也可以写成下面的形式。

async function timeout(ms) {
  await new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value, ms);
}

asyncPrint('hello world', 50);

使用async函数的多种形式。

// 函数声明
async function foo() {}

// 函数表达式
const foo = async function() {}

// 对象的方法
let obj = {
    async foo() {}
};
obj.foo().then(...)
class Storage {}
// Class 的方法
class Storage {
    constructor () {
        this.catchPromise = caches.open('avatars');
    }

    async getAvatar(name) {
        const cache = await this.catchProise;
        return catch.match('/avatars/${name}.jpg');
    }
}
const storage = new Storage();
storage.getAvatar('jack').then(() => {...});

// 箭头函数
const foo = async () => {};

3、语法

关于语法,async函数的语法规则总体上比较简单,难点是错误处理机制。


3.1、返回 Promise 对象

我们知道,async函数返回一个Promise对象。
而且async函数内部return语句返回的值,会成为then方法回调函数的参数。

async function f() {
  return 'hello world';
}
f().then(v => console.log(v)); // hello world

上面 代码中,函数f内部return命令返回的值,会被then方法回调函数接收到。
命令async函数内部抛出错误,会导致返回的Promise对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

async function f() {
  throw new Error('出错了');
}

f().then((v, e) => {
  console.log(v);
  console.log(e);
});
// Error: 出错了

3.2、Promise 对象的状态变化

命令async函数返回的Promise对象,必须等到内部所有await命令后面的Promise对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

下面 是一个例子。

async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/([\s\S]+)<\/title>/i)[1];
}
getTitle('http://es6.ruanyifeng.com/#docs/async#%E8%AF%AD%E6%B3%95').then(
  res => {
    console.log(res); // ECMAScript 6入门
  }
);
</code></pre> 
 <p>上面 代码中,函数<code>getTitle</code>内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行<code>then</code>方法里面的<code>console.log</code></p> 
 <hr> 
 <h4>3.3、<code>await</code> 命令</h4> 
 <p>正常情况下,<code>await</code>命令后面是一个<code>Promise</code>对象,返回该对象的结果。如果不是<code>Promise</code>对象,就直接返回对应的值。</p> 
 <pre><code class="javascript">async function f() {
  // 等同于
  // return 123;
  return await 123;
}

f().then(v => console.log(v));
</code></pre> 
 <p>上面 代码中,<code>await</code>命令的参数是数值<code>123</code>,这时等同于<code>return 123</code>。<br> 另一种情况是,<code>await</code>命令后面是一个<code>thenable</code>对象(即定义<code>then</code>方法的对象),那么<code>await</code>会将其等同于<code>Promise</code>对象。</p> 
 <pre><code class="javascript">class Sleep {
  constructor(timeout) {
    this.timeout = timeout;
  }
  then(resolve, reject) {
    const startTime = Date.now();
    setTimeout(() => resolve(Date.now() - startTime), this.timeout);
  }
}

(async () => {
  const sleepTime = await new Sleep(2000);
  console.log(sleepTime);
})();
// 1000
</code></pre> 
 <p>上面 代码中,<code>await</code>命令后面是一个<code>Sleep</code>对象的实例。这个实例不是<code>Promise</code>对象,因为定义了<code>then</code>方法,<code>await</code>会将其视为<code>Promise</code>对象处理。<br> 这个例子还演示了如何实现休眠效果。<code>Javascript</code>一直没有休眠的语法,但是借助<code>await</code>命令就可以让程序停顿指定的时间。下面给出了一个简化的<code>sleep</code>实现。</p> 
 <pre><code class="javascript">function sleep(interval) {
  return new Promise(resolve => {
    setTimeout(resolve, interval);
  });
}

async function one2FiveInAsync() {
  for (let i = 1; i <= 5; i++) {
    console.log(i);
    await sleep(1000);
  }
}

one2FiveInAsync(); // 1 2 3 4 5
</code></pre> 
 <p><code>await</code>命令后的<code>Promise</code>对象如果变为<code>reject</code>状态,则<code>reject</code>的参数会被<code>catch</code>方法的回调函数接收到。</p> 
 <pre><code class="javascript">async function f() {
  await Promise.reject('出错了');
}

f()
  .then(v => console.log(v))
  .catch(e => console.log(e));
// 出错了
</code></pre> 
 <p>注意,上面 代码中,<code>await</code>语句前面没有<code>return</code>,但是<code>reject</code>方法的参数依然传入了<code>catch</code>方法的回调函数。这里如果在<code>await</code>命令前面加上<code>return</code>,效果是一样的。</p> 
 <p>任何一个<code>await</code>语句后面的<code>Promise</code>对象变为<code>reject</code>状态,那么整个<code>async</code>函数都会中断执行。</p> 
 <pre><code class="javascript">async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}
</code></pre> 
 <p>上面 代码中,第二个<code>await</code>语句是不会执行的,因为第一个<code>await</code>语句状态变成了<code>reject</code>。<br> 有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个<code>await</code>放在<code>try...catch</code>结构里面,这样不管这个异步操作是否成功,第二个异步操作都会执行。</p> 
 <pre><code class="javascript">async function f() {
  try {
    await Promise('出错了');
  } catch (e) {}
  return await Promise.resolve('hello world');
}

f().then(v => console.log(v));
// hello world
</code></pre> 
 <p>另一种方法是<code>await</code>后面的<code>Promise</code>对象再跟一个<code>catch</code>方法,处理前面可能出现的错误。</p> 
 <pre><code class="javascript">async function f() {
  await Promise.reject('出错了').catch(e => console.log(e));
  return await Promise.resolve('hello world');
}
f().then(v => console.log(v));
// 出错了
// hello world
</code></pre> 
 <hr> 
 <h4>3.4、错误处理</h4> 
 <p>如果<code>await</code>后面的异步操作出错,那么等同于<code>async</code>函数返回的<code>Promise</code>对象被<code>reject</code>。</p> 
 <pre><code class="javascript">async function f() {
  await new Promise((resolve, reject) => {
    throw new Error('出错了');
  });
}
f()
  .then(v => console.log(v))
  .catch(e => console.log(e));
// Error: 出错了
</code></pre> 
 <p>上面 代码中,<code>async</code>函数<code>f</code>执行后,<code>await</code>后面的<code>Promise</code>对象会抛出一个错误对象,导致<code>catch</code>方法的回调函数被调用,它的参数就是抛出的错误对象。具体的执行机制,可以参考后文的<code>async 函数的实现原理</code>。</p> 
 <p>防止出错的方法,也是将其放在<code>try...catch</code>代码块之中。</p> 
 <pre><code class="javascript">async function f() {
  try {
    await new Promise((resolve, reject) => {
      throw new Error('出错了');
    });
  } catch (e) {}
  return await 'hello world';
}
</code></pre> 
 <p>如果有多个<code>await</code>命令,可以统一放在<code>try...catch</code>结构中。</p> 
 <pre><code class="javascript">async function main() {
  try {
    const val1 = await firstStep();
    const val2 = await secondStep(val1);
    const val3 = await thirdStep(val1, val2);

    console.log('Final:' + val3);
  } catch (e) {
    console.log(e);
  }
}
</code></pre> 
 <p>下面 的例子 使用<code>try...catch</code>结构,实现多次重复尝试。</p> 
 <pre><code class="javascript">const superagent = require('superagent');
const NUM_RETRIES = 3;

async function test() {
  let i;
  for (i = 0; i < NUM_RETRIES; i++) {
    try {
      await superagent.get('http://google.com/this-throws-an-error');
      break;
    } catch (err) {}
  }
  console.log(i); // 3
}

test();
</code></pre> 
 <p>上面代码中,如果<code>await</code>操作成功,就会使用<code>break</code>语句跳出循环 ♻️;如果失败,会被<code>catch</code>语句捕捉,然后进入下一轮循环 ♻️。</p> 
 <hr> 
 <h4>3.5、使用注意点</h4> 
 <p>第一点,前面已经说过,<code>await</code>命令后面的<code>Promise</code>对象,运行结果可能是<code>rejected</code>,所以最好把<code>await</code>命令放在<code>try...catch</code>代码块中。</p> 
 <pre><code class="javascript">async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法
async function myFunction() {
  await somethingThatReturnsAPromise().catch(err => console.log(err));
}
</code></pre> 
 <p>第二点,多个<code>await</code>命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。</p> 
 <pre><code class="javascript">let foo = await getFoo();
let bar = await getBar();
</code></pre> 
 <p>上面 代码中,<code>getFoo</code>和<code>getBar</code>是两个独立的异步操作(相互不依赖),被写成继发关系。这样比较耗时,因为只有<code>getFoo</code>完成之后,才会执行<code>getBar</code>,完全可以让它们同时触发。</p> 
 <pre><code class="javascript">// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
</code></pre> 
 <p>上面 两种写法,<code>getFoo</code>和<code>getBar</code>都是同时触发,这样就会缩短程序的执行时间。</p> 
 <p>第三点,<code>await</code>命令只能用在<code>async</code>函数之中,如果用在普通函数,就会报错。</p> 
 <pre><code class="javascript">async function dbFuc(db) {
  let docs = [{}, {}, {}];

  docs.forEach(function (doc) => {
    await db.post(doc);
  });
  // Uncaught SyntaxError: await is only valid in async function
}
</code></pre> 
 <p>上面 代码会报错,因为<code>await</code>语句用在普通函数之中了。但是,如果将<code>forEach</code>方法的参数改成<code>async</code>函数,也有问题。</p> 
 <pre><code class="javascript">function dbFuc(db) {
  // 这里不需要 async
  let docs = [{}, {}, {}];
  // 可能得到错误结果
  docs.forEach(async function(doc) {
    await db.post(doc);
  });
}
</code></pre> 
 <p>上面 代码可能不会正常工作,原因是这时三个<code>db.post</code>操作将是并发执行,也就是同时执行,而不是继发执行。正确的写法是采用<code>for</code>循环。</p> 
 <pre><code class="javascript">async function dbFunc(db) {
  let docs = [{}, {}, {}];
  for (let doc of docs) {
    await db.post(doc);
  }
}
</code></pre> 
 <p>如果确实希望多个请求并发执行,可以使用<code>Promise.all</code>方法。当三个请求都会<code>resolved</code>时,下面两种写法效果相同。</p> 
 <pre><code class="javascript">async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promise = docs.map(doc => db.post(doc));
  let results = await Promise.all(promise);
  console.log(results);
}
// 或者使用下面的写法
async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let peomises = docs.map(doc => db.post(doc));

  let results = [];
  for (let promise of promises) {
    results.push(await promise);
  }
  console.log(results);
}
</code></pre> 
 <h4>3.6、<code>async</code> 函数可以保留堆栈</h4> 
 <pre><code class="javascript">const a = () => {
  b().then(() => c());
};
</code></pre> 
 <p>上面 代码中,函数<code>a</code>内部运行了一个异步任务<code>b()</code>。当<code>b()</code>运行的时候,函数<code>a</code>不会中断,而是继续执行。等到<code>b()</code>运行结束,可能<code>a()</code>早就运行结束了,<code>b</code>所在的上下文环境已经消失了。如果<code>b()</code>或<code>c()</code>报错,错误堆栈将不包括<code>a()</code>。</p> 
 <p>现在将这个例子 改成<code>await</code>函数。</p> 
 <pre><code class="javascript">const a = async () => {
  await b();
  c();
};
</code></pre> 
 <p>上面 的代码中,<code>b()</code>运行的时候,<code>a()</code>是暂停执行,上下文环境都保存着。一旦<code>b()</code>或<code>c()</code>报错,错误堆栈将包括<code>a()</code>。</p> 
 <h3>4、<code>async</code> 函数的实现原理</h3> 
 <p><code>async</code>函数的实现原理,就是将<code>Generator</code>函数和自动执行器,包装在一个函数里。</p> 
 <pre><code class="javascript">async function fn(args) {
  // ...
}
// 等同于
function fn(args) {
  return spawn(function*() {
    // ...
  });
}
</code></pre> 
 <p>所有的<code>async</code>函数都可以写成上面的第二种形式,其中的<code>spawn</code>函数就是自动执行器。<br> 下面给出<code>spawn</code>函数的实现,基本就是前文自动执行器的翻版。</p> 
 <pre><code class="javascript">function spawn(genF) {
  return new Promise((resolve, reject) => {
    const gen = genF();
    function step(nextF) {
      let next;
      try {
        next = nextF();
      } catch (e) {
        return reject(e);
      }
      if (next.done) {
        return resolve(next.value);
      }
      Promise.resolve(next.value).then(
        v => {
          step(() => {
            return gen.next(v);
          });
        },
        e => {
          step(() => {
            return gen.throw(e);
          });
        }
      );
    }
    step(() => {
      return gen.next(undefined);
    });
  });
}
</code></pre> 
 <hr> 
 <h3>5、与其他异步处理方法的比较</h3> 
 <p>我们通过一个例子,来看<code>async</code>函数与<code>Generator</code>与<code>Promise</code>函数的比较。<br> 假定某个<code>DOM</code>元素上面,部署了一系列的动画,前一个动画结束,才能开始下一个。如果当中有一个动画出错,返回上一个成功执行的动画的返回值。</p> 
 <p>首先是<code>Promise</code>的写法。</p> 
 <pre><code class="javascript">function chainAnimationsPromise(elem, animations) {
  // 变量 ret 用来保存上一个动画的返回值
  let ret = null;

  // 新建一个空的 Promise
  let p = Promise.resolve();

  // 使用 then 方法添加所有动画
  for (let anim of animations) {
    p = p.then(val => {
      ret = val;
      return anim(elem);
    });
  }

  // 返回一个部署了错误机制的 Promise
  return p
    .catch(e => {
      /*忽略错误,继续执行*/
    })
    .then(() => {
      return ret;
    });
}
</code></pre> 
 <p>虽然<code>Promise</code>的写法比回调函数的写法大大改进,但是一眼看上去,代码完全都是<code>Promise</code>的<code>API</code>(<code>then</code>、<code>catch</code>等等),操作本身的语义反而不容易看出来。</p> 
 <p>接着是<code>Generator</code>函数的写法。</p> 
 <pre><code class="javascript">function chainAnimationsGenerator(elem, animations) {
  return spawn(function*() {
    let ret = null;
    try {
      for (anim of animations) {
        ret = yield anim(elem);
      }
    } catch (e) {
      /*忽略错误,继续执行*/
    }
    return ret;
  });
}
</code></pre> 
 <p>上面 代码使用<code>Generator</code>函数遍历了每个动画,语义比<code>Promise</code>写法更清晰,用户定义的操作全部都出现在<code>spawn</code>函数的内部。这个写法的问题在于,必须有一个任务运行器,自动执行<code>Generator</code>函数,上面的代码<code>spawn</code>就是自动执行器,它返回一个<code>Promise</code>对象,而且必须保证<code>yield</code>语句后面的表达式,必须返回一个<code>Promise</code>。</p> 
 <p>最后是<code>async</code>函数的写法。</p> 
 <pre><code class="javascript">async function chainAnimationsAsync(elem, animations) {
  let ret = null;
  try {
    for (let anim of animations) {
      ret = await anim(elem);
    }
  } catch (e) {
    /*忽略错误,继续执行*/
  }
  return ret;
}
</code></pre> 
 <p>可以看到,<code>async</code></p> 
 <hr> 
 <p>本文参考来源 阮一峰博客 async。</p> 
</article>������������������������������������������������������������������������������������������������������������
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1489884452652867584"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(ES6之 async 函数)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950232190038110208.htm"
                           title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a>
                        <span class="text-muted">universe_01</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div>
                    </li>
                    <li><a href="/article/1950231254427299840.htm"
                           title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a>
                        <span class="text-muted">香尧</span>

                        <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</div>
                    </li>
                    <li><a href="/article/1950228031524106240.htm"
                           title="Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程" target="_blank">Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程</a>
                        <span class="text-muted">倾听铃的声</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet处理请求的过程的源码解析。本文是第二篇:DispatcherServlet处理请求的过程的源码解析。@pdaiSpring进阶-SpringMVC实现原理之DispatcherServlet处理请求的</div>
                    </li>
                    <li><a href="/article/1950225785054883840.htm"
                           title="Java | 多线程经典问题 - 售票" target="_blank">Java | 多线程经典问题 - 售票</a>
                        <span class="text-muted">Ada54</span>

                        <div>一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3</div>
                    </li>
                    <li><a href="/article/1950225532016717824.htm"
                           title="恩小希美食成长日记之118:“摘星女神”王亚平归来,她的婚姻,治愈了多少职场女性的痛" target="_blank">恩小希美食成长日记之118:“摘星女神”王亚平归来,她的婚姻,治愈了多少职场女性的痛</a>
                        <span class="text-muted">恩小希</span>

                        <div>上周最为热闹的消息,无疑是神舟13号的三位航天英雄回来了.其中,最为瞩目的就是王亚平.她是我国首位进行太空行走的女航天员,也是为自己小女儿“摘星星的妈妈”。作为最受关注的职场妈妈,王亚平之所以能够成就这样一番事业,跟背后默默支持她的丈夫--赵鹏分不开。01王亚平1980年出生于山东烟台。父母都是地地道道的农民。王亚平这个姑娘从小体质好,一直练习长跑。高中时,空军来家乡招收女飞行员,作为体育班里唯一</div>
                    </li>
                    <li><a href="/article/1950225020974329856.htm"
                           title="2019-07-30" target="_blank">2019-07-30</a>
                        <span class="text-muted">西域社群</span>

                        <div>天地之间,分外热闹。望热浪涛涛,引无数帅哥竞开撩,夕窈窕淑女皆露腰。一代天骄,群里热闹。不见美女露妖娆,唯见帅哥手机忙,唐诗宋词,广为流传,惜字如金,声情并茂。君悉吾析,今日之局有套路,昨日之生惹人恋。聚往矣,数风流人物还看今朝!!</div>
                    </li>
                    <li><a href="/article/1950222345163567104.htm"
                           title="深入理解汇编语言子程序设计与系统调用" target="_blank">深入理解汇编语言子程序设计与系统调用</a>
                        <span class="text-muted">网安spinage</span>
<a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96/1.htm">汇编</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>本文将全面解析汇编语言中子程序设计的核心技术以及系统调用的实现方法,涵盖参数传递的多种方式、堆栈管理、API调用等关键知识点,并提供实际案例演示。一、子程序设计:参数传递的艺术1.寄存器传参:高效简洁.386.modelflat,stdcalloptioncasemap:none.dataxdd5;定义变量ydd6sumdd?.code;函数定义:addxy1addxy1procpushebpmo</div>
                    </li>
                    <li><a href="/article/1950222094314827776.htm"
                           title="【老房翻新】92平轻奢简约风,将和谐之美融入空间!" target="_blank">【老房翻新】92平轻奢简约风,将和谐之美融入空间!</a>
                        <span class="text-muted">没人比我更懂装修</span>

                        <div>在客厅空间中,设计师于冷静的空间基调中选用了层次感丰富的黄蓝色作为主要跳色,搭配黑白纹理的地毯与单椅,为空间增加了时尚摩登的气息。艺术感的单品突出点亮了空间,绿植的点缀、留白的软饰则增强了空间的呼吸性。点击此处添加图片说明文字点击此处添加图片说明文字设计师力求使每一处的设立都在空间中达到相互间的呼应与制衡,将艺术的跃动之美赋于空间之上,也将空间的和谐之美融于生活之中。点击此处添加图片说明文字点击此</div>
                    </li>
                    <li><a href="/article/1950219924043526144.htm"
                           title="二十四节气组诗 谷雨" target="_blank">二十四节气组诗 谷雨</a>
                        <span class="text-muted">离陌_6639</span>

                        <div>图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之</div>
                    </li>
                    <li><a href="/article/1950218399846035456.htm"
                           title="营销活动-大转盘" target="_blank">营销活动-大转盘</a>
                        <span class="text-muted">無缺520</span>

                        <div>写在前面最近,首先营销活动工具这块我是再熟悉不过了。曾经做了不下20个活动工具,然后通过监控活动数据反推活动的好坏。文中主要讲解幸运大转盘营销工具一.大转盘定义大转盘是比较常见的营销活动工具,它是通过消费者用户控制【开始/停止】操作获得奖品物品。用户在不知道自己能获得什么奖品的条件下,然后通过抽奖,大概率的获得未知的奖品。类似最近流行的盲盒玩法。二.为什么做大转盘大转盘是最常用的抽奖类的活动工具之</div>
                    </li>
                    <li><a href="/article/1950217809610993664.htm"
                           title="分支和循环(下)" target="_blank">分支和循环(下)</a>
                        <span class="text-muted">tryxr</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>写⼀个猜数字游戏游戏要求:1.电脑⾃动⽣成1~100的随机数2.玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束1.随机数生成要想完成猜数字游戏,⾸先得产⽣随机数,那怎么产⽣随机数呢?randC语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的,函数原型如下所⽰:intrand(void);rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_</div>
                    </li>
                    <li><a href="/article/1950217304876838912.htm"
                           title="STM32入门之TIM基本定时器" target="_blank">STM32入门之TIM基本定时器</a>
                        <span class="text-muted">嵌入式白话</span>
<a class="tag" taget="_blank" href="/search/STM32%E5%85%A5%E9%97%A8%E5%AD%A6%E4%B9%A0/1.htm">STM32入门学习</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a>
                        <div>一、定时器简介定时器是嵌入式系统中的关键外设之一,它可以用于生成精确的延时、周期性中断、PWM波形生成等功能。在STM32F1系列单片机中,定时器不仅能为系统提供精确的时钟,还支持外部事件的捕获以及信号输出。对于定时器的功能,我们可以通过一个生活中非常常见的例子来形象地描述:微波炉的定时器。想象你正在使用微波炉加热食物。在微波炉里,定时器的作用就是帮助你控制食物加热的时间。当你设置了加热时间后,定</div>
                    </li>
                    <li><a href="/article/1950215474298023936.htm"
                           title="收集落叶" target="_blank">收集落叶</a>
                        <span class="text-muted">申文秀</span>

                        <div>走啊,一起走,我们一起去收集落叶落叶的模样早已映入我的眼帘耳边已响起叶子落在地上的“沙沙”声走啊,去收集落叶,落叶是我们的回忆落叶的样子如此俏皮心形是写给秋姑娘的情书圆形是秋姑娘送给大地的礼物三角形是秋姑娘礼服上的碎珠片哟!秋姑娘举行的盛装宴会开始了你看!秋之宴会开始了松叶缓缓飘落在空中跳起了华尔兹枫叶跳着芭蕾兜着圈子盘旋而下银杏叶是杂技演员,正“七上八下”地翻跟头每个落叶都在宴会上展示自己最美妙</div>
                    </li>
                    <li><a href="/article/1950215091567783936.htm"
                           title="婴童医话(五百六十)" target="_blank">婴童医话(五百六十)</a>
                        <span class="text-muted">妙手柯楠</span>

                        <div>探天地清浊之源,察阴阳顺逆之机。“乳食过饱蓄胃中,乳片不化吐频频,身热面黄腹膨胀。”伤乳吐者,因乳食过饱,停蓄胃中,以致运化不及,吐多乳片,犹如物盛满而上溢也。其证身热面黄,肚腹膨胀。治宜化其宿乳,安胃和中,节其乳食,自然止也。“过食伤胃腹胀热,恶食口臭吐酸粘,眼胞虚浮身潮热。”伤食吐者,因小儿饮食无节,过食油腻、面食等物,以致壅塞中脘而成也,其证肚腹胀热,恶食口臭,频吐酸粘,眼胞虚浮,身体潮热。</div>
                    </li>
                    <li><a href="/article/1950214784112717824.htm"
                           title="C++ :vector的模拟" target="_blank">C++ :vector的模拟</a>
                        <span class="text-muted">诚自然成</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>目录一、vector的迭代器二、vector的构造函数默认构造函数参数构造函数迭代器范围构造函数拷贝构造函数swap:交换vector重载赋值符析构函数reserve:扩容vectorresize:调整大小push_back:添加元素empty:判空pop_back:后删获取大小与容量:size(),capacity()重载operator[]:元素访问insert:插入元素erase:删除一个元</div>
                    </li>
                    <li><a href="/article/1950213690397618176.htm"
                           title="【阳光️️☀️苑长 幸福365】7月9日《就此刻确知》" target="_blank">【阳光️️☀️苑长 幸福365】7月9日《就此刻确知》</a>
                        <span class="text-muted">阳光苑长</span>

                        <div>音频文字原创|阳光苑长图片发自App一夜的梦境,情景相当的壮烈,那是前前后后多个情节的叠加,那是因为极其在意在正义的,完满的,在早已经确认——万古之先已经确认了一切美好的事物当中。当有假象,当有一些不好的势力,试图想去破坏夺取的时候,在梦境中一直得力的征战,为着身边最挚爱的朋友,为他,为所有美好的事业而守望。守望,英文叫做watcher,就是观望者。图片发自App在这个毫不奇怪,事实上一直发生的征</div>
                    </li>
                    <li><a href="/article/1950212284320116736.htm"
                           title="漫步,跳出藩篱" target="_blank">漫步,跳出藩篱</a>
                        <span class="text-muted">张巧金沙</span>

                        <div>最近的教学,倍感不爽。一为这国庆之假,把这课上得支离破碎的。放假前,上了四天课,但我却只上了三天,9月30日,我工作室在搞活动,全天的活动,课当然未能上。10月8日学生回校,上了两天课,学生又放回家了。就觉得学生刚有点状态,又回去逍遥去了。感觉吧,教学内容也不敢大胆甩开膀子去教学,所以呀,这教学内容还真上不走,而且学生学下来效果特差。这不,国庆放假前的一个周,测试了两次,均为第一单元,是自考试以来</div>
                    </li>
                    <li><a href="/article/1950210758742700032.htm"
                           title="用好考评指挥棒 答好时代新答卷" target="_blank">用好考评指挥棒 答好时代新答卷</a>
                        <span class="text-muted">天才码字选手</span>

                        <div>民之所望,施政所向。而群众评议正是检验发展质量和人民获得感的试金石。究竟是“走过场”、“栽盆景”,还是俯下身子,甘当为民服务的“孺子牛”或撸起袖子,做担当作为的“拓荒牛”,群众自是看得清清楚楚,最有发言权。因而也有这样一句话:干部脚下沾多少泥土,群众心里就有多少感情。民意不可或缺,群众的意见不能少。新时代下,要最大程度发挥群众评议在激励干部担当作为中的效能,才能汇聚起推动高质量发展的磅礴之力,答好</div>
                    </li>
                    <li><a href="/article/1950208352168505344.htm"
                           title="总会有一道光之利刃 能划破暗夜长空!" target="_blank">总会有一道光之利刃 能划破暗夜长空!</a>
                        <span class="text-muted">一滴Sea</span>

                        <div>图片发自App一帆风顺的人生很难产生什么顿悟,只有扎扎心,人才会醒悟,所以人生路上偶尔的风浪冲突,都可以怡情,和着一杯清茶一品人生的滋味。图片发自App中国人的传统家教就是:优点不鼓励,心知肚明就好,有缺点一定要细细碎碎仔细倒嚼,然后编织成一张唠叨之网把家人孩子都包裹的严严实实,苦口婆心地说:“走大街的人,没有人像我这样说你,你该感恩才是!”图片发自App唉!真是让人一口长气无处抒发,多少孩子因为</div>
                    </li>
                    <li><a href="/article/1950208107430866944.htm"
                           title="python笔记14介绍几个魔法方法" target="_blank">python笔记14介绍几个魔法方法</a>
                        <span class="text-muted">抢公主的大魔王</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>python笔记14介绍几个魔法方法先声明一下各位大佬,这是我的笔记。如有错误,恳请指正。另外,感谢您的观看,谢谢啦!(1).__doc__输出对应的函数,类的说明文档print(print.__doc__)print(value,...,sep='',end='\n',file=sys.stdout,flush=False)Printsthevaluestoastream,ortosys.std</div>
                    </li>
                    <li><a href="/article/1950204266194989056.htm"
                           title="今天的彭格列依然被世界游戏吓得瑟瑟发抖呢" target="_blank">今天的彭格列依然被世界游戏吓得瑟瑟发抖呢</a>
                        <span class="text-muted">云染舒倦</span>

                        <div>前言有一天,有一个白兰的大魔王想要毁灭世界,创世者非常不高兴,于是,创始者用吞噬一切,包容一切的大空(泽田纲吉)、捉摸不定的雾(六道骸)、孤高的浮云(云雀恭弥)、愤怒的忠岚(狱寺隼人)、晕染一切的雨(山本武)、守护之雷(蓝波)、热血之晴(晴川了平)创造了七位拯救世界的勇士(用属性制造勇士),让他们跟白兰对抗。。。[白兰的力量是游戏,于是要打败他,只要同样在世界布置的游戏中,赢过白兰就行了~]图片发</div>
                    </li>
                    <li><a href="/article/1950202936449626112.htm"
                           title="Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略" target="_blank">Qwen3 大模型实战:使用 vLLM 部署与函数调用(Function Call)全攻略</a>
                        <span class="text-muted">曦紫沐</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/1.htm">大模型部署</a><a class="tag" taget="_blank" href="/search/Qwen3/1.htm">Qwen3</a><a class="tag" taget="_blank" href="/search/vLLM/1.htm">vLLM</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8/1.htm">函数调用</a>
                        <div>文章摘要本文将带你从零开始,深入掌握如何使用Qwen3-8B大语言模型,结合vLLM进行高性能部署,并通过函数调用(FunctionCall)实现模型与外部工具的智能联动。我们将详细讲解部署命令、调用方式、代码示例及实际应用场景,帮助你快速构建基于Qwen3的智能应用。一、Qwen3简介与部署环境准备Qwen3是通义千问系列的最新一代大语言模型,具备强大的自然语言理解和生成能力,尤其在函数调用、工</div>
                    </li>
                    <li><a href="/article/1950202684451647488.htm"
                           title="[spring6: Mvc-网关]-源码解析" target="_blank">[spring6: Mvc-网关]-源码解析</a>
                        <span class="text-muted"></span>

                        <div>推荐阅读:[spring6:Mvc-函数式编程]-源码解析GatewayServerMvcAutoConfiguration@AutoConfiguration(after={HttpClientAutoConfiguration.class,RestTemplateAutoConfiguration.class,RestClientAutoConfiguration.class,FilterAu</div>
                    </li>
                    <li><a href="/article/1950199576451411968.htm"
                           title="20210517坚持分享53天读书摘抄笔记 非暴力沟通——爱自己" target="_blank">20210517坚持分享53天读书摘抄笔记 非暴力沟通——爱自己</a>
                        <span class="text-muted">f79a6556cb19</span>

                        <div>让生命之花绽放在赫布·加德纳(HerbGardner)编写的《一千个小丑》一剧中,主人公拒绝将他12岁的外甥交给儿童福利院。他郑重地说道:“我希望他准确无误地知道他是多么特殊的生命,要不,他在成长的过程中将会忽视这一点。我希望他保持清醒,并看到各种奇妙的可能。我希望他知道,一旦有机会,排除万难给世界一点触动是值得的。我还希望他知道为什么他是一个人,而不是一张椅子。”然而,一旦负面的自我评价使我们看</div>
                    </li>
                    <li><a href="/article/1950197540850823168.htm"
                           title="好学生引路人2021年6月21日星期一" target="_blank">好学生引路人2021年6月21日星期一</a>
                        <span class="text-muted">一米阳光2025年</span>

                        <div>5组21号董文娟(甘肃省白银市靖远县小芦小学语文教师)的打卡记录:1.听录音,读原文:《论语·学政第二》之2.42[爱心]2.听分享,写心得:认真聆听了好几遍辛教授的讲解《为政第二》2.4后,深有感触,孔子说自己的学习是有所自觉的学习,而不是盲目的学习。自己最向往的志向,三十而立,坚定的自守,立于自己的志向,我感觉我自己正处于这个“三十而立”的年龄,能真正达到一切游刃有余,财务自由,志向远大的生命</div>
                    </li>
                    <li><a href="/article/1950195499067830272.htm"
                           title="量子计算解决气候变化:科学家找到了新方法" target="_blank">量子计算解决气候变化:科学家找到了新方法</a>
                        <span class="text-muted">大力出奇迹985</span>
<a class="tag" taget="_blank" href="/search/%E9%87%8F%E5%AD%90%E8%AE%A1%E7%AE%97/1.htm">量子计算</a>
                        <div>气候变化已成为全球面临的严峻挑战,传统计算方法在应对与之相关的复杂问题时存在诸多局限。而量子计算作为新兴技术,为解决气候变化难题带来曙光。本文深入剖析科学家利用量子计算应对气候变化的新方法。量子计算凭借独特的量子比特与量子特性,在加速气候模型计算、优化模型参数、预测极端天气事件等方面展现出巨大优势。同时,在可再生能源整合、电网管理、碳捕获等实际应用场景中也发挥着重要作用。尽管目前面临硬件和算法等方</div>
                    </li>
                    <li><a href="/article/1950193584867176448.htm"
                           title="守一朵花,偏安春之一隅" target="_blank">守一朵花,偏安春之一隅</a>
                        <span class="text-muted">者者行</span>

                        <div>图片发自App守一朵花,偏安春之一隅云雾压城的那一刻我发现世界小了许多高楼耸立,挨着天女的脚丫脚贴大地柔软的腹河水湿润了游离的眼际风偏安春的围城在我的身体里生根育芽远山,那块曾经蕴藏着诗的圣地不见也罢此刻我只想读懂泥土的温柔和挂在纤纤枝头的那抹春色它是那么轻盈像蝴蝶的羽翼我多想折一枝春寄给遥远的你可又怕你见到的是一朵将萎的花近日的烟雨,给江城的春色增添了些许朦胧之美。灰白的天色,让我的视界后退了不</div>
                    </li>
                    <li><a href="/article/1950192217708621824.htm"
                           title="lesson20:Python函数的标注" target="_blank">lesson20:Python函数的标注</a>
                        <span class="text-muted">你的电影很有趣</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>目录引言:为什么函数标注是现代Python开发的必备技能一、函数标注的基础语法1.1参数与返回值标注1.2支持的标注类型1.3Python3.9+的重大改进:标准集合泛型二、高级标注技巧与最佳实践2.1复杂参数结构标注2.2函数类型与回调标注2.3变量注解与类型别名三、静态类型检查工具应用3.1mypy:最流行的类型检查器3.2Pyright与IDE集成3.3运行时类型验证四、函数标注的工程价值与</div>
                    </li>
                    <li><a href="/article/1950191461337198592.htm"
                           title="算法刷题-动态规划之背包问题" target="_blank">算法刷题-动态规划之背包问题</a>
                        <span class="text-muted"></span>

                        <div>1.背包问题之01(4.30)题目描述小明有一个容量为VV的背包。这天他去商场购物,商场一共有NN件物品,第ii件物品的体积为wiwi,价值为vivi。小明想知道在购买的物品总体积不超过VV的情况下所能获得的最大价值为多少,请你帮他算算。输入描述输入第11行包含两个正整数N,VN,V,表示商场物品的数量和小明的背包容量。第2∼N+12∼N+1行包含22个正整数w,vw,v,表示物品的体积和价值。1</div>
                    </li>
                    <li><a href="/article/1950191294076743680.htm"
                           title="一些身体的自描" target="_blank">一些身体的自描</a>
                        <span class="text-muted">王神马</span>

                        <div>短发,黑色的盆栽浇水,裁剪只为了衬托盆的好看手掌,黄色的落叶纵横交错的脉络指引生命之树是哪一棵双脚,行走的印章镌刻着生命的贵重每一条人生都值得铭记眉毛,情绪的微澜紧促,上扬都牵动着那根心弦</div>
                    </li>
                                <li><a href="/article/29.htm"
                                       title="SQL的各种连接查询" target="_blank">SQL的各种连接查询</a>
                                    <span class="text-muted">xieke90</span>
<a class="tag" taget="_blank" href="/search/UNION+ALL/1.htm">UNION ALL</a><a class="tag" taget="_blank" href="/search/UNION/1.htm">UNION</a><a class="tag" taget="_blank" href="/search/%E5%A4%96%E8%BF%9E%E6%8E%A5/1.htm">外连接</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E8%BF%9E%E6%8E%A5/1.htm">内连接</a><a class="tag" taget="_blank" href="/search/JOIN/1.htm">JOIN</a>
                                    <div>一、内连接 
  概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。 
                内连接(join 或者inner join ) 
      SQL语法: 
      select * fron</div>
                                </li>
                                <li><a href="/article/156.htm"
                                       title="java编程思想--复用类" target="_blank">java编程思想--复用类</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BB%A7%E6%89%BF/1.htm">继承</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86/1.htm">代理</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E5%90%88/1.htm">组合</a><a class="tag" taget="_blank" href="/search/final%E7%B1%BB/1.htm">final类</a>
                                    <div>      复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书 
  
一:组合语法:就是将对象的引用放到新类中即可 
    代码: 
    
package com.wj.reuse;

/**
 * 
 * @author Administrator 组</div>
                                </li>
                                <li><a href="/article/283.htm"
                                       title="[开源与生态系统]国产CPU的生态系统" target="_blank">[开源与生态系统]国产CPU的生态系统</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/cpu/1.htm">cpu</a>
                                    <div> 
 
      计算机要从娃娃抓起...而孩子最喜欢玩游戏.... 
 
      要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节.... 
 
      投入一些资金和资源,人力和政策,让游</div>
                                </li>
                                <li><a href="/article/410.htm"
                                       title="JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释" target="_blank">JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释</a>
                                    <span class="text-muted">商人shang</span>
<a class="tag" taget="_blank" href="/search/jvm%E5%86%85%E5%AD%98/1.htm">jvm内存</a>
                                    <div>jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。 
HotSpot虚拟机GC算法采用分代收</div>
                                </li>
                                <li><a href="/article/537.htm"
                                       title="页面上调用 QQ" target="_blank">页面上调用 QQ</a>
                                    <span class="text-muted">oloz</span>
<a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a>
                                    <div><A href="tencent://message/?uin=707321921&amp;Site=有事Q我&amp;Menu=yes">   
<img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a></div>
                                </li>
                                <li><a href="/article/664.htm"
                                       title="一些问题" target="_blank">一些问题</a>
                                    <span class="text-muted">文强chu</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a>
                                    <div>1.eclipse 导出 doc  出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 ..... 
SQL:3.mysql  * 必须得放前面 否则  select&nbs</div>
                                </li>
                                <li><a href="/article/791.htm"
                                       title="生活没有安全感" target="_blank">生活没有安全感</a>
                                    <span class="text-muted">小桔子</span>
<a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E5%AD%A4%E7%8B%AC/1.htm">孤独</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E6%84%9F/1.htm">安全感</a>
                                    <div>       圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明</div>
                                </li>
                                <li><a href="/article/918.htm"
                                       title="php 基础语法" target="_blank">php 基础语法</a>
                                    <span class="text-muted">aichenglong</span>
<a class="tag" taget="_blank" href="/search/php+%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95/1.htm">php 基本语法</a>
                                    <div>1 .1 php变量必须以$开头 
<?php 
$a=” b”; 
echo 
?> 
1 .2 php基本数据库类型 Integer  float/double Boolean string 
1 .3 复合数据类型 数组array和对象 object 
1 .4 特殊数据类型  null 资源类型(resource)    $co</div>
                                </li>
                                <li><a href="/article/1045.htm"
                                       title="mybatis tools 配置详解" target="_blank">mybatis tools 配置详解</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a>
                                    <div>MyBatis Generator中文文档 
MyBatis Generator中文文档地址: 
 
 http://generator.sturgeon.mopaas.com/ 
 
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。 
本文使用Markdown进行编辑,但是博客显示效</div>
                                </li>
                                <li><a href="/article/1172.htm"
                                       title="继承与多态的探讨" target="_blank">继承与多态的探讨</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/JAVA%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1+%E7%BB%A7%E6%89%BF+%E5%AF%B9%E8%B1%A1/1.htm">JAVA面向对象 继承 对象</a>
                                    <div>继承 extends   多态 
继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字: 
  
  
在A类中定义属性和方法; 
class A{
//定义属性
int age;
//定义方法
public void go</div>
                                </li>
                                <li><a href="/article/1299.htm"
                                       title="JS的undefined与null的实例" target="_blank">JS的undefined与null的实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div><form name="theform" id="theform">
</form>

<script language="javascript">
    var a
    alert(typeof(b));    //这里提示undefined
    if(theform.datas</div>
                                </li>
                                <li><a href="/article/1426.htm"
                                       title="TDD实践(一)" target="_blank">TDD实践(一)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7/1.htm">敏捷</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a>
                                    <div>一.TDD概述 
        TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。 
    </div>
                                </li>
                                <li><a href="/article/1553.htm"
                                       title="[Maven学习笔记十]Maven Profile与资源文件过滤器" target="_blank">[Maven学习笔记十]Maven Profile与资源文件过滤器</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                                    <div>什么是Maven Profile 
Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息 
  
Profile的激活机制 
1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P</div>
                                </li>
                                <li><a href="/article/1680.htm"
                                       title="【Hive八】Hive用户自定义生成表函数(UDTF)" target="_blank">【Hive八】Hive用户自定义生成表函数(UDTF)</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a>
                                    <div>1. 什么是UDTF 
  
UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集 
  2. 如何实现UDTF 
 
 继承org.apache.hadoop.hive.ql.udf.generic</div>
                                </li>
                                <li><a href="/article/1807.htm"
                                       title="tfs restful api 加auth 2.0认计" target="_blank">tfs restful api 加auth 2.0认计</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>  目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点: 
  一是基于客户端的ip设置。这个比较容易实现。 
  二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。 
  现在重点介绍第二种方法实现思路。 
   
前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe</div>
                                </li>
                                <li><a href="/article/1934.htm"
                                       title="jdk环境变量配置" target="_blank">jdk环境变量配置</a>
                                    <span class="text-muted">byalias</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a>
                                    <div>进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 
 
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe 
 
2、安装jdk-7u79-windows-x64.exe 
 
3、配置环境变量:右击"计算机"-->&quo</div>
                                </li>
                                <li><a href="/article/2061.htm"
                                       title="《代码大全》表驱动法-Table Driven Approach-2" target="_blank">《代码大全》表驱动法-Table Driven Approach-2</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>package com.ljn.base;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.uti</div>
                                </li>
                                <li><a href="/article/2188.htm"
                                       title="SQL 数值四舍五入 小数点后保留2位" target="_blank">SQL 数值四舍五入 小数点后保留2位</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5/1.htm">四舍五入</a>
                                    <div>  
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。 
2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。 
例如: 
  select   cast(round(12.5,2)   as   numeric(5,2))  </div>
                                </li>
                                <li><a href="/article/2315.htm"
                                       title="c++运算符重载" target="_blank">c++运算符重载</a>
                                    <span class="text-muted">CrazyMizzz</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>一、加+,减-,乘*,除/ 的运算符重载 
 
Rational operator*(const Rational &x) const{ 
 return Rational(x.a * this->a); 
 } 
在这里只写乘法的,加减除的写法类似 
 
二、<<输出,>>输入的运算符重载 
     &nb</div>
                                </li>
                                <li><a href="/article/2442.htm"
                                       title="hive DDL语法汇总" target="_blank">hive DDL语法汇总</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E5%88%97/1.htm">修改列</a><a class="tag" taget="_blank" href="/search/DDL/1.htm">DDL</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E8%A1%A8/1.htm">修改表</a>
                                    <div>hive DDL语法汇总 
1、对表重命名 
hive> ALTER TABLE table_name RENAME TO new_table_name; 
  
2、修改表备注 
hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm</div>
                                </li>
                                <li><a href="/article/2569.htm"
                                       title="jbox使用说明" target="_blank">jbox使用说明</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>参考网址:http://www.kudystudio.com/jbox/jbox-demo.html   jBox v2.3 beta    [ 
点击下载]  
 
技术交流QQGroup:172543951 100521167   
 
 [2011-11-11] jBox v2.3 正式版 
 - [调整&修复] IE6下有iframe或页面有active、applet控件</div>
                                </li>
                                <li><a href="/article/2696.htm"
                                       title="UISegmentedControl 开发笔记" target="_blank">UISegmentedControl 开发笔记</a>
                                    <span class="text-muted">dcj3sjt126com</span>

                                    <div>  //    typedef NS_ENUM(NSInteger, UISegmentedControlStyle) { 
    //        UISegmentedControlStylePlain,     // large plain 
  &</div>
                                </li>
                                <li><a href="/article/2823.htm"
                                       title="Slick生成表映射文件" target="_blank">Slick生成表映射文件</a>
                                    <span class="text-muted">ekian</span>
<a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a>
                                    <div>Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包 
 
"com.typesafe.slick"    %% "slick-codegen"      % slickVersion 
因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包 
 

"com.typesa</div>
                                </li>
                                <li><a href="/article/2950.htm"
                                       title="ES-TEST" target="_blank">ES-TEST</a>
                                    <span class="text-muted">gengzg</span>
<a class="tag" taget="_blank" href="/search/test/1.htm">test</a>
                                    <div>package com.MarkNum;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation</div>
                                </li>
                                <li><a href="/article/3077.htm"
                                       title="为何外键不再推荐使用" target="_blank">为何外键不再推荐使用</a>
                                    <span class="text-muted">hugh.wang</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/DB/1.htm">DB</a>
                                    <div>表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。 
 
在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不</div>
                                </li>
                                <li><a href="/article/3204.htm"
                                       title="领域驱动设计" target="_blank">领域驱动设计</a>
                                    <span class="text-muted">julyflame</span>
<a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/DTO/1.htm">DTO</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a>
                                    <div>概念: 
 
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 
 
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对</div>
                                </li>
                                <li><a href="/article/3331.htm"
                                       title="单例设计模式" target="_blank">单例设计模式</a>
                                    <span class="text-muted">hm4123660</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Singleton/1.htm">Singleton</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">单例设计模式</a><a class="tag" taget="_blank" href="/search/%E6%87%92%E6%B1%89%E5%BC%8F/1.htm">懒汉式</a><a class="tag" taget="_blank" href="/search/%E9%A5%BF%E6%B1%89%E5%BC%8F/1.htm">饿汉式</a>
                                    <div>       单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 
     &nb</div>
                                </li>
                                <li><a href="/article/3458.htm"
                                       title="logback" target="_blank">logback</a>
                                    <span class="text-muted">zhb8015</span>
<a class="tag" taget="_blank" href="/search/log/1.htm">log</a><a class="tag" taget="_blank" href="/search/logback/1.htm">logback</a>
                                    <div>一、logback的介绍 
     Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class</div>
                                </li>
                                <li><a href="/article/3585.htm"
                                       title="整合Kafka到Spark Streaming——代码示例和挑战" target="_blank">整合Kafka到Spark Streaming——代码示例和挑战</a>
                                    <span class="text-muted">Stark_Summer</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/PARALLELISM/1.htm">PARALLELISM</a><a class="tag" taget="_blank" href="/search/processing/1.htm">processing</a>
                                    <div>作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版</div>
                                </li>
                                <li><a href="/article/3712.htm"
                                       title="spring-master-slave-commondao" target="_blank">spring-master-slave-commondao</a>
                                    <span class="text-muted">王新春</span>
<a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/dataSource/1.htm">dataSource</a><a class="tag" taget="_blank" href="/search/slave/1.htm">slave</a><a class="tag" taget="_blank" href="/search/master/1.htm">master</a>
                                    <div>互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。 
 
为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>